您没有使用通话权。查看简介或文档中的任何示例。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文档的人比我更好。)