Mar*_*ram 28 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
Run Code Online (Sandbox Code Playgroud)
但是如果我添加shell=True它就会开始工作.有人可以解释原因吗?
>>> import subprocess as s
>>> s.call("gpio -g read 17", shell=True)
>>> 0
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 47
你没有使用通话权.查看文档中的介绍或任何示例.调用的第一个参数是"args",一个参数序列,其中arg [0]是要运行的程序.
所以,当你这样做时:
s.call("gpio -g read 17")
Run Code Online (Sandbox Code Playgroud)
子进程可以通过两种方式解释这一点.它应该运行一个名为"g"的程序,其参数为"p","i","o",""等.(记住,字符串是字符序列.)它可能会运行一个名为"gpio -g read"的程序17"没有额外的论据.无论哪种方式,它都不会找到这样的程序.(除非你碰巧在你的PATH上有一个名为"g"或"gpio -g read 17"的程序,在这种情况下它会做错事而不是给你一个错误......)
你想要的是:
s.call(["gpio", "-g", "read", "17"])
Run Code Online (Sandbox Code Playgroud)
那么,如果你通过,为什么这会起作用shell=True呢?因为整个字符串被传递给shell,然后shell自己解析命令行并用空格分隔.这就像打电话os.system("gpio -g read 17").
请注意,以上所有内容都有点过于简单(它忽略了Windows,而shell解析实际上并不是"按空格分隔"等等),因此您应该实际阅读文档.(另外,无论谁写的subprocess文档都是比我更好的作家.)