Python 使用参数从subprocess.call调用应用程序

Python 使用参数从subprocess.call调用应用程序,python,process,python-2.6,raspberry-pi,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

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

你没有正确使用电话。查看文档中的示例或任何示例。调用的第一个参数是“args”,这是一系列参数,其中arg[0]是要运行的程序

因此,当您这样做时:

s.call("gpio -g read 17")
子流程有两种解释方法。它应该运行一个名为“g”的程序,其中包含参数“p”、“i”、“o”、“等”(请记住,字符串是字符序列)。它可以运行一个名为“gpio-g read 17”的程序,而不包含其他参数。不管怎样,它都找不到这样的程序。(除非您的路径上碰巧有一个名为“g”或“gpio-g read 17”的程序,在这种情况下,它会做错误的事情,而不是给您一个错误…)

你想要的是:

s.call(["gpio", "-g", "read", "17"])
那么,如果您传递了
shell=True
,为什么会这样呢?因为整个字符串都被传递给shell,然后shell自己解析命令行,并用空格分隔。这就像调用
os.system(“gpio-g read 17”)


请注意,上面的所有内容都有点过于简单(它忽略了窗口,shell解析实际上不仅仅是“按空格分隔”,等等),因此您应该实际阅读文档。(另外,编写
子流程
文档的人比我写得好。)

并且使用
shell=True
,这个命令被发送到一个shell,该shell随后执行拆分参数拆分。@MarkIngram——显然我们是在同一时间进行评论的。实际上,我看到了这个问题并开始编辑我的答案,然后当我点击“保存”时,你的答案出现了…
s.call(["gpio", "-g", "read", "17"])