当前位置: 首页 > 面试题库 >

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

百里杰
2023-03-14
问题内容

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

问题答案:

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



 类似资料:
  • 问题内容: 我知道我可以使用以下命令从bash脚本运行python脚本: 但是,如果我想将变量/自变量从bash脚本传递到python脚本,该怎么办?我怎样才能做到这一点? 基本上,bash会计算出文件名,然后python将其上传,但是当我调用它时,我需要将文件名从bash发送到python。 问题答案: 要在bash脚本中执行python脚本,您需要调用与终端相同的命令。例如 要在python中

  • 问题内容: 我正在尝试获取python的subprocess.call方法以通过列表(由字符串序列组成)接受一些args命令,如python文档中所建议。为了在将此行为放到我的实际脚本中之前对其进行探索,我打开了IPython,运行了一些涉及shell设置和args命令不同组合的命令,并得到以下行为: 似乎无论何时shell = True,输出似乎都与以下内容相同: 我很困惑;当我设置shell

  • 我想从java代码调用python并将参数传递给python中的函数。我已经在python中封装了一个函数。但问题是我还在python程序中导入了第三方库skLearning。当我调用测试程序并将值传递给python时,我能够运行代码。但是当我尝试在python代码中使用第三方库,例如skLearning和import时,我得到了以下错误。 我初始化了Python解释器类的对象,然后使用以下命令,

  • 问题内容: 我有一个php文件,其中定义了许多功能,比如: 我想打电话给使用 AJAX 。谢谢您的帮助 问题答案: 您不能直接通过AJAX调用来调用PHP函数,但是您可以这样做: PHP: JS:

  • 我有一个 Scala 类,它使用 Apache Spark 中的 MR 作业返回输入类型 IN 的最大值。如果我从Scala调用它,这个类工作正常,它的工作原理如下: 现在我想让它也可以从java中调用,但是我在传递隐式参数时遇到了一些困难。我知道隐式参数可以通过在Java中将它们追加到参数列表中来传递,但是隐式参数是在Scala中。因此,我正在努力做到以下几点: 然后可以从java调用: 我尝试

  • 问题内容: 我有一个内部进行一些修改的函数,它返回一个值。 最初的想法是做这样的事情: 不幸的是,这不适用于Oracle。建议做这种事情的方法是什么? 有没有办法从我的陈述中提取声明的变量? 问题答案: Hibernate Session提供了一种直接访问的方法。然后,您可以创建并用于执行功能: