2013-02-12 15 views
25

Ich bin mit dem subprocess.Popen Anruf, und in einer anderen Frage fand ich heraus, dass ich Missverständnis war, wie Python wurde Argumente für die Kommandozeile zu erzeugen.Ausgabe der Befehlszeile von Subprozess aufgerufen?

Meine Frage
Gibt es einen Weg, um herauszufinden, was die eigentliche Kommandozeile war?

Beispielcode: -

proc = subprocess.popen(....) 
print "the commandline is %s" % proc.getCommandLine() 

Wie würden Sie getCommandLine schreiben?

Antwort

41

Es hängt von der Version von Python Sie verwenden. In Python3.3 wird die arg in proc.args gespeichert:

proc = subprocess.Popen(....) 
print("the commandline is {}".format(proc.args)) 

In python2.7, the args not saved, ist er gerade auf wie _execute_child an andere Funktionen übergeben. Also, in diesem Fall der beste Weg, um die Befehlszeile zu erhalten, ist es zu sparen, wenn Sie es haben:

proc = subprocess.Popen(shlex.split(cmd)) 
print "the commandline is %s" % cmd 

Beachten Sie, dass wenn Sie die Liste der Argumente (wie die Art von Sache von shlex.split(cmd) zurückgegeben, dann können Sie den Befehlszeilen-Zeichenfolge, cmd mit der undokumentierte Funktion subprocess.list2cmdline erholen:

In [14]: import subprocess 

In [15]: import shlex 

In [16]: cmd = 'foo -a -b --bar baz' 

In [17]: shlex.split(cmd) 
Out[17]: ['foo', '-a', '-b', '--bar', 'baz'] 

In [18]: subprocess.list2cmdline(['foo', '-a', '-b', '--bar', 'baz']) 
Out[19]: 'foo -a -b --bar baz' 
+0

Ich bin in 2.6. Und in 2.6 zumindest ist es gut, dass list2cmdline undokumentiert ist, weil es nicht funktioniert: für '--arg = foo bar' was Python tatsächlich tut ist '--arg = "foo bar"' aber was list2cmdline gibt ist '" --arg = foo bar "'... aber danke. –

+0

Ich denke, das Problem gibt es nicht mit 'list2cmdline', sondern' shlex.split'. 'shlex.split ('- arg =" foo bar "')' gibt eine Liste mit einem einzigen Item zurück: '['--arg = foo bar']', während 'shlex.split ('- arg =" foo bar "')' teilt die Argumente korrekt auf: '[' --arg ',' = ',' foo bar ']'. Auf dieser Liste funktioniert 'list2cmdline' gut. – unutbu

+0

By the way, verwendet python2.6 die 'subprocess' Modul' 'list2cmdline' args' in eine Liste zu konvertieren, wenn' args' keinen String ist, so dass es im Sinne arbeitet das, was Sie als Rückgabewert von sehen ' list2cmdline (args) 'ist genau das, was an' execvp * 'oder das Windows-Äquivalent übergeben wird. – unutbu

2

die richtige Antwort auf meine Frage ist eigentlich, dass es IS keine Befehlszeile. Der Punkt des Subprozesses ist, dass alles über IPC erledigt wird. Die list2cmdline ist so nah wie es erwartet werden kann, aber in Wirklichkeit ist es das Beste, sich die "args" -Liste anzuschauen und nur zu wissen, dass das argv im aufgerufenen Programm sein wird.

+2

['list2cmdline()'] (https: // hg.python.org/cpython/file/f38489a3394f/Lib/subprocess.py#l541) ist nur unter Windows für Anwendungen nützlich, die mit der Syntax von MS C-Laufzeit-Befehlszeilen kompatibel sind. Es konvertiert eine Liste von Argumenten in eine Zeichenfolge, die an CreateProcess() übergeben wird. ['cmd.exe' verwendet andere Regeln] (http://stackoverflow.com/q/27864103/4279). Auf POSIX wird die Liste direkt an os.execve() '(+/- os.fsencode()) übergeben. – jfs

Verwandte Themen