2012-08-03 6 views
9

파이썬에서 초보자 해요, 나는 명령 줄 응용 프로그램을 호출하는 시도를하고 있어요,하지만 실패호출 응용 프로그램은

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

그러나 나는 shell=True을 추가하는 경우 모두 작동하기 시작합니다. 왜 누군가가 설명 할 수 있습니까?

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

답변

24

통화 권한을 사용하고 있지 않습니다. the introduction 또는 문서의 예를보세요. call의 첫 번째 인수는 "args"이며, arg [0]은 실행할 프로그램입니다. 그래서

,이 작업을 수행 :

서브 프로세스는이 해석 할 수있는 방법은 두 가지가 있습니다
s.call("gpio -g read 17") 

. "p", "i", "o", ""등의 인수를 가진 "g"라는 프로그램을 실행해야합니다 (문자열은 일련의 문자입니다). 대신에 "gpio -g read 17 "추가 인수없이. 어느 쪽이든, 그것은 그런 프로그램을 찾지 않을 것입니다. ("g"또는 "gpio -g read 17"프로그램을 PATH에 두지 않으면 오류가 발생하는 대신 오류가 발생합니다 ...)

원하는 것은 무엇입니까? :

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

따라서 shell=True을 넘기는 이유는 무엇입니까? 이 전체 문자열이 셸로 전달되면 명령 줄을 구문 분석하고 공백으로 구분합니다. os.system("gpio -g read 17")을 호출하는 것과 같습니다.

위의 모든 내용은 약간은 지나치게 단순화되어 있습니다 (Windows는 무시되고 셸 구문 분석은 실제로는 공백으로 구분되지 않음). 따라서 실제로 설명서를 읽어야합니다. (누구도 subprocess 문서를 작성한 사람이 저보다 더 낫습니다.)

+0

"shell = True"를 추가하면 왜 효과가 있습니까? –

+3

'shell = True'의 경우,이 명령은 쉘에 보내지고 쉘은 분할 인수를 분할합니다. – mgilson

+0

@ MarkIngram - 분명히 우리는 동시에 논평했다. – mgilson