2012-08-03 8 views
9

私はPythonで初心者だ、と私は、コマンドラインアプリを呼び出すようにしようとしてきたが、それは失敗します。呼び出すアプリは

>>> 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]は実行するプログラムです。だから、

、あなたがこれを行う:

サブプロセスは、これを解釈することができ、2つの方法があります
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

関連する問題