35

私は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
4

1 に答える 1

60

通話権を使用していません。ドキュメントの概要または例のいずれかをてください。callの最初の引数は、一連の引数である「args」です。ここで、arg[0]は実行するプログラムです。

したがって、これを行うと:

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

サブプロセスがこれを解釈する方法は2つあります。引数「p」、「i」、「o」、「」などを指定して「g」というプログラムを実行する必要があります(文字列は文字のシーケンスであることに注意してください)。代わりに「gpio-gread」というプログラムを実行する場合があります。追加の引数なしで17"。いずれにせよ、そのようなプログラムを見つけることはできません。(PATHに「g」または「gpio-g read 17」というプログラムがある場合を除いて、エラーが発生するのではなく、間違った処理を実行します…)

あなたが欲しいものは:

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

それで、あなたが合格した場合、なぜこれが機能するのですshell=Trueか?この文字列全体がシェルに渡されるため、シェルはコマンドラインを独自に解析し、スペースで区切ります。を呼び出すようなものos.system("gpio -g read 17")です。

上記のすべてが少し単純化されていることに注意してください(Windowsを無視し、シェルの解析は実際には「スペースで区切る」などではありません)。したがって、実際にドキュメントを読む必要があります。(また、subprocessドキュメントを書いた人は誰でも私よりも優れたライターです。)

于 2012-08-03T18:14:37.123 に答える