使用参数从subprocess.call调用app

时间:2012-08-03 18:12:42

标签: python process python-2.6 raspberry-pi

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

1 个答案:

答案 0 :(得分:43)

您没有使用通话权限。查看the introduction或文档中的任何示例。调用的第一个参数是“args”,一个参数序列,其中arg [0]是要运行的程序。

所以,当你这样做时:

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

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

你想要的是:

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

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

请注意,以上所有内容都有点过于简单(它忽略了Windows,而shell解析实际上并不只是“按空格分隔”等等),所以你应该真正阅读文档。 (另外,撰写subprocess文档的人比我更好。)