2012-08-03 15 views
9

io sono un principiante in Python, e ho cercato di chiamare un'applicazione a riga di comando, ma non riesce:Chiamata app dalla subprocess.call con argomenti

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

Ma allora se aggiungo che shell=True tutto inizia a funzionare. Qualcuno può spiegare perché?

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

risposta

24

Non stai utilizzando la chiamata giusta. Guarda the introduction o uno degli esempi nei documenti. Il primo argomento di chiamata è "args", una sequenza di argomenti, dove arg [0] è il programma da eseguire.

Così, quando si esegue questa operazione:

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

Ci sono due modi sottoprocesso potrebbe interpretare questo. Dovrebbe eseguire un programma chiamato "g" con argomenti "p", "i", "o", "", ecc. (Ricordare che le stringhe sono sequenze di caratteri.) Potrebbe invece eseguire un programma chiamato "gpio -g leggi 17 "senza argomenti aggiuntivi. Ad ogni modo, non troverà un programma del genere. (A meno che tu non abbia un programma chiamato "g" o "gpio -g leggi 17" sul tuo PATH, nel qual caso farà la cosa sbagliata invece di darti un errore ...)

Quello che vuoi è :

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

Quindi, perché funziona se si passa shell=True? Perché questa intera stringa viene passata alla shell, che quindi esegue la propria analisi della riga di comando e separa le cose in base agli spazi. È come chiamare os.system("gpio -g read 17").

Si prega di notare che tutto quanto sopra è un po 'troppo semplificato (ignora Windows, e l'analisi della shell non è in realtà solo "separata da spazi", e così via), quindi si dovrebbe effettivamente leggere la documentazione. (Inoltre, chiunque abbia scritto i documenti subprocess è uno scrittore migliore di me.)

+0

Perché l'aggiunta di "shell = True" lo rende funzionante? –

+3

E con 'shell = True', questo comando viene inviato a una shell, che quindi divide l'argomento splitting. – mgilson

+0

@MarkIngram - apparentemente stavamo commentando allo stesso tempo. – mgilson

Problemi correlati