繁体   English   中英

使用参数从subprocess.call调用app

[英]Calling app from subprocess.call with arguments

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

你没有使用通话权。 查看文档中的介绍或任何示例。 调用的第一个参数是“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文档的人比我更好。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM