2012-08-03 12 views
9

yo soy un principiante en Python, y he estado tratando de llamar a una aplicación de línea de comandos, pero falla:aplicación de subprocess.call con argumentos

>>> import subprocess as s 
>>> s.call("gpio -g read 17") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/subprocess.py", line 470, in call 
     return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 623, in __init__ 
     errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child 
     raise child_exception 
OSError: [Errno 2] No such file or directory 

Pero entonces si añado que shell=True todo comienza a funcionar ¿Alguien puede explicar por qué?

>>> import subprocess as s 
>>> s.call("gpio -g read 17", shell=True) 
>>> 0 

Respuesta

24

No está utilizando la llamada correcta. Mire the introduction o cualquiera de los ejemplos en los documentos. El primer argumento de llamada es "args", una secuencia de argumentos, donde arg [0] es el programa que se ejecutará.

Por lo tanto, cuando se hace esto:

s.call("gpio -g read 17") 

Hay dos maneras de interpretar este subproceso podría. Debería ejecutar un programa llamado "g" con argumentos "p", "i", "o", "", etc. (Recuerde, las cadenas son secuencias de caracteres). En su lugar, podría ejecutar un programa llamado "gpio -g read 17 "sin argumentos adicionales. De cualquier manera, no va a encontrar un programa así. (A menos que tenga un programa llamado "g" o "gpio -g read 17" en su PATH, en cuyo caso hará lo incorrecto en lugar de darle un error ...)

Lo que quiere es :

s.call(["gpio", "-g", "read", "17"]) 

Así que, ¿por qué este trabajo si pasa shell=True? Debido a que toda esta cadena pasa al shell, que luego hace su propio análisis de la línea de comando y separa las cosas por espacios. Es como llamar al os.system("gpio -g read 17").

Tenga en cuenta que todo lo anterior es un poco simplificado (ignora Windows, y el análisis de shell no está realmente "separado por espacios", etc.), por lo que debería leer la documentación. (Además, quien escribió el documento subprocess es mejor escritor que yo.)

+0

¿Por qué agregar "shell = True" hace que funcione? –

+3

Y con 'shell = True', este comando se envía a un shell, que luego divide el argumento de división. – mgilson

+0

@MarkIngram - al parecer estábamos comentando al mismo tiempo. – mgilson

Cuestiones relacionadas