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'
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. –
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
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