2012-08-03 17 views
9

Python içinde acemiyim ve bir komut satırı uygulaması aramaya çalışıyorum, ama başarısız:çağırma uygulaması

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

Ama sonra shell=True eklerseniz her şey çalışmaya başlar. Birisi nedenini açıklayabilir mi?

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

cevap

24

Doğrudan çağrı kullanmıyorsunuz. the introduction ya da dokümanlardaki örneklerden birine bakın. Çağrının ilk argümanı argümanların argümanı olan "args", argümanın [0] çalışacağı programdır. Yani

, bunu:

altişlem bu yorumlayabilir iki yolu vardır
s.call("gpio -g read 17") 

. "P", "i", "o", "" vb. Argümanlar ile "g" adlı bir program çalıştırmalıdır. (Unutmayın, dizeler karakter dizileridir.) Bunun yerine "gpio -g read" adlı bir program çalıştırabilir Ek argümanlar olmadan 17 ". Her iki durumda da böyle bir program bulamayacak. (PATH'nızda "g" veya "gpio -g read 17" adlı bir programınız olmadıkça, size bir hata vermek yerine yanlış bir şey yaparsınız…)

Ne istiyorsunuz? :

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

Öyleyse neden shell=True bu iş geçmesi ne olur? Çünkü bu bütün dize kabuklara geçer, ki bu da kendi komut satırının kendi ayrışmasını yapar ve nesneleri boşluklarla ayırır. os.system("gpio -g read 17")'u aramak gibi.

Yukarıdakilerin hepsinin biraz aşırı basitleştirilmiş olduğunu unutmayın (Windows'u yok sayar ve kabuk ayrıştırması gerçekten "boşluklara göre ayrı değil" vb.), Bu nedenle belgeleri gerçekten okumalısınız. (Ayrıca, subprocess belgelerini yazan kişi benden daha iyi bir yazardır.)

+0

"shell = True" öğesi eklendiğinde neden işe yarar? –

+3

Ve 'shell = True' ile, bu komut daha sonra ayrıştırma argümanını bölerek bir kabuğa gönderilir. – mgilson

+0

@MarkIngram - görünüşte aynı anda yorum yapıyorduk. – mgilson