python - una - ¿Salida la línea de comando llamada por subproceso?
salto de linea en una lista python (2)
Estoy usando el subprocess.Popen
Llamada subprocess.Popen
, y en otra pregunta descubrí que había estado malinterpretando cómo Python estaba generando argumentos para la línea de comandos.
Mi pregunta
¿Hay alguna manera de averiguar cuál era la línea de comando real?
Código de ejemplo: -
proc = subprocess.popen(....)
print "the commandline is %s" % proc.getCommandLine()
¿Cómo escribirías getCommandLine
?
Depende de la versión de Python que estés usando. En Python3.3 , el argumento se guarda en proc.args
:
proc = subprocess.Popen(....)
print("the commandline is {}".format(proc.args))
En Python2.7, los argumentos no se guardan , solo se pasan a otras funciones como _execute_child
. Entonces, en ese caso, la mejor manera de obtener la línea de comandos es guardarla cuando la tenga:
proc = subprocess.Popen(shlex.split(cmd))
print "the commandline is %s" % cmd
Tenga en cuenta que si tiene la lista de argumentos (como el tipo de cosa devuelta por shlex.split(cmd)
, entonces puede recuperar la cadena de línea de comandos, cmd
usando la función subprocess.list2cmdline
no documentada:
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''
La respuesta correcta a mi pregunta es en realidad que no hay línea de comandos. El punto del subproceso es que hace todo a través de IPC. El list2cmdline hace lo más cercano posible, pero en realidad lo mejor que puede hacer es mirar la lista de "args", y saber que eso será argv en el programa llamado.