使用subprocess.Popen时,使用可执行参数与将exe路径作为命令中的第一项有什么区别?

时间:2019-01-14 23:26:03

标签: python subprocess

我一直在尝试运行SAM CLI,以通过Python构建和运行本地api。

subprocess.Popen 函数中使用 executable 参数与将exe路径作为中的第一项之间似乎有所不同args 列表。我认为这是因为SAM CLI根据我使用的方法返回不同的响应。我采用的两种方法有什么区别?为什么第一种方法会失败?

第一种方法

<style name="customPopupMenuStyle" parent="@android:style/Widget.PopupMenu">
    <item name="android:listPreferredItemHeightSmall">32dp</item>
</style>

失败并返回:错误:无此选项:-u

第二种方法

PopupMenu

工作并完成该过程。

  

exe存储“ sam.exe”的路径

2 个答案:

答案 0 :(得分:4)

调用subprocess.call(['a', 'b', 'c'])时,它将调用程序a并传递参数:

argv[0] = "a"
argv[1] = "b"
argv[2] = "c"

习惯上将调用的程序的名称传递为argv[0],因此假定第一个参数也是可执行文件是一个方便的快捷方式。

如果要对该程序进行更高级的控制,可以指定executable参数。如果您调用subprocess.call(['x', 'b', 'c'], executable='a'),它将调用传递参数的程序a

argv[0] = "x"
argv[1] = "b"
argv[2] = "c"

现在argv[0]的值与可执行文件的名称不匹配。有关系吗?好吧,这取决于程序。大多数程序都不会调查它,因为重命名该程序并不重要。但是,诸如busybox之类的某些程序被设计为可以用许多不同的名称来调用,它们使用argv[0]来发挥作用。

以您为例,当您调用subprocess.call(["build", "-u"], executable=exe)时,您正在运行正确的程序,但带有参数:

argv[0] = "build"
argv[1] = "-u"

argv[0]被忽略,因为它被当作程序的名称。那么它会遇到-u并且不知道该如何处理。因此,错误。

解决方案是为argv[0]指定一个合理的值:

subprocess.call(["SAM", "build", "-u"], executable=exe)

但是,最明智的值通常是exe,然后您可以删除exectuable可选参数,然后编写:

subprocess.call([exe, "build", "-u"])

这是您的工作代码。

答案 1 :(得分:1)

Popen

的文档字符串开始
  

executable:要执行的替换程序。

      input, standard output and standard error file handles, respectively.

从代码的最下方开始

        ...
        if shell:
            args = ["/bin/sh", "-c"] + args
            if executable:
                args[0] = executable

因此executable标志指定要使用和运行命令的程序。默认情况下使用外壳程序运行,但是您可以指定不同的方式。