2013-02-12 11 views
25

Używam wywołania subprocess.Popen iw innym pytaniu dowiedziałem się, że nie rozumiałem, jak Python generuje argumenty dla wiersza poleceń.wyprowadzić linię poleceń wywoływaną przez podproces?

Moje pytanie
Czy istnieje sposób sprawdzenia rzeczywistej linii poleceń?

Przykład Code: -

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

Jak byś napisać getCommandLine?

Odpowiedz

41

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' 
+0

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

+0

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

+0

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

2

prawidłowa odpowiedź na moje pytanie jest rzeczywiście, że nie IS bez wiersza poleceń. Punktem podprocesu jest to, że robi wszystko poprzez IPC. List2cmdline jest tak blisko, jak można się spodziewać, ale w rzeczywistości najlepiej jest spojrzeć na listę "args" i po prostu wiedzieć, że będzie to argv w wywołanym programie.

+2

['list2cmdline()'] (https: // hg.python.org/cpython/file/f38489a3394f/Lib/subprocess.py#l541) jest przydatny tylko w Windows dla aplikacji kompatybilnych z tym, w jaki sposób MS runtime analizuje wiersze poleceń. Konwertuje listę argumentów na ciąg przekazywany do 'CreateProcess()'. ['cmd.exe' używa różnych reguł] (http://stackoverflow.com/q/27864103/4279). W POSIX-ie lista jest przekazywana bezpośrednio do 'os.execve()' (+/- os.fsencode()). – jfs

Powiązane problemy