【问题标题】:Calling app from subprocess.call with arguments使用参数从 subprocess.call 调用应用程序
【发布时间】:2012-08-01 19:40:08
【问题描述】:

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

【问题讨论】:

    标签: python process python-2.6 raspberry-pi


    【解决方案1】:

    您没有使用通话权限。查看the introduction 或文档中的任何示例。 call的第一个参数是“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 文档的人比我写得更好。)

    【讨论】:

    • shell = True,这个命令被发送到一个shell,然后执行分割参数分割。
    • @MarkIngram -- 显然我们同时发表了评论。
    • 实际上,我看到了问题并开始编辑我的答案,然后当我点击“保存”时,您的答案出现了……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    相关资源
    最近更新 更多