使用参数从subprocess.call调用应用

发布于 2021-01-29 17:45:17

我是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
被浏览
149
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您没有使用通话权。查看简介或文档中的任何示例。call的第一个参数是“ args”,这是一个参数序列,其中arg [0]是要运行的程序。

    因此,当您执行此操作时:

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

    子流程可以通过两种方式对此进行解释。它应该运行带有参数“ p”,“ i”,“ o”,“”等的名为“
    g”的程序。(请记住,字符串是字符序列。)它可能会运行名为“ gpio -g
    read”的程序17英寸,无其他参数。无论哪种方式,都不会找到这样的程序。(除非您碰巧在PATH上有一个名为“ g”或“ gpio
    -g读取17”的程序,在这种情况下,它会做错事而不是给您错误……)


    您想要的是:

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

    那么,如果您通过了,为什么这项工作有效shell=True?因为这整个字符串都传递给了外壳程序,然后外壳程序对命令行进行了自己的解析,并用空格分隔了内容。这就像打电话os.system("gpio -g read 17")

    请注意,以上所有内容都被简化了一些(它忽略Windows,而shell解析实际上并不仅仅是“用空格分隔”,依此类推),因此您应该阅读文档。(此外,撰写subprocess文档的人比我更好。)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看