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

subprocess 有两种方式可以解释这一点。它应该运行一个名为“g”的程序,参数为“p”、“i”、“o”、“”等。(记住,字符串是字符序列。)它可能会运行一个名为“gpio -g read”的程序17" 没有额外的参数。无论哪种方式,它都不会找到这样的程序。(除非你碰巧在你的 PATH 上有一个名为“g”或“gpio -g read 17”的程序,在这种情况下,它会做错事而不是给你一个错误......)

你想要的是:

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

那么,如果您通过了,为什么这会起作用shell=True?因为整个字符串被传递给 shell,然后它自己解析命令行并用空格分隔。就像打电话一样os.system("gpio -g read 17")

请注意,以上所有内容都过于简单化了(它忽略了 Windows,并且 shell 解析不仅仅是“用空格分隔”等等),因此您应该实际阅读文档。(另外,写subprocess文档的人比我写得更好。)

于 2012-08-03T18:14:37.123 回答