To zależy od wersji Pythona, z którego korzystasz. In Python3.3, Arg jest zapisany w proc.args
:
proc = subprocess.Popen(....)
print("the commandline is {}".format(proc.args))
W Python2.7, the args
not saved, to jest po prostu przekazywane do innych funkcji jak _execute_child
. Tak więc, w tym przypadku, najlepszym sposobem, aby uzyskać wiersz polecenia jest, aby go zapisać kiedy masz go:
proc = subprocess.Popen(shlex.split(cmd))
print "the commandline is %s" % cmd
pamiętać, że jeśli masz listę argumentów (takie jak rodzaj rzecz zwracane przez shlex.split(cmd)
, wtedy można odzyskać ciąg wiersza polecenia, cmd
użyciu nieudokumentowane funkcję subprocess.list2cmdline
:
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'
Jestem w 2.6. A w 2.6 jest co najmniej dobrze, że list2cmdline jest nieudokumentowane, ponieważ nie działa: dla '--arg = foo bar' to, co Python faktycznie robi, to '--arg = "foo bar"', ale to co daje list2cmdline to "" --arg = foo bar "" ... ale dzięki. –
Myślę, że problem nie ma z 'list2cmdline', ale raczej' shlex.split'. 'shlex.split ('- arg =" foo bar "')' zwraca listę z pojedynczym elementem: '['--arg = foo bar']', natomiast 'shlex.split ('- arg =" foo bar "')" poprawnie dzieli argumenty: '[' --arg ',' = ',' foo bar ']'. Na tej ostatniej liście 'list2cmdline' działa dobrze. – unutbu
Nawiasem mówiąc, Python2.6 'subprocess' moduł używa' list2cmdline' do konwertowania 'args' na listę, gdy' args' nie jest łańcuchem, więc działa w tym sensie, że to co widzisz jako wartość zwracaną ' list2cmdline (args) 'jest dokładnie tym, co jest przekazywane do' execvp * 'lub odpowiednika Windows. – unutbu