我是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
答案 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
文档的人比我更好。)