从参数subprocess.call调用应用程序(Calling app from subproce

2019-06-26 17:56发布

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

Answer 1:

您没有使用呼叫权限。 看看引进或在文档中的示例。 呼叫的第一个参数是“ARGS”,的参数,其中arg [0]是运行该程序的序列。

所以,当你这样做:

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

有两种方法可以子解释这个。 它应该运行一个名为“G”与参数“P”程序,“I”,“O”,“”等。(记住,字符串是字符的序列。)它可能不是运行一个名为“GPIO -g阅读17" ,没有额外的参数。 无论哪种方式,它不会找到这样的程序。 (除非你碰巧有一个名为“G”或“GPIO -g阅读17”在你的路径程序,在这种情况下,它会做的,而不是给你一个错误的错误的事情...)

你想要的是:

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

那么,为什么这个工作,如果你通过shell=True ? 因为这个整个字符串被传递给shell,然后做自己的命令行的解析和用空格分开的东西。 这就像调用os.system("gpio -g read 17")

请注意,上述所有的有点过于简单(它忽略了Windows和壳解析是不是真的只是“用空格分开的”,等等),所以你实际上应该阅读文档。 (另外,谁写的subprocess文档是一个比我更好的作家。)



文章来源: Calling app from subprocess.call with arguments