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



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

子流程中使用可执行文件参数。Popen函数与将exe的路径作为args列表中的第一项似乎有区别。我认为这是因为SAM CLI根据我使用的方法返回不同的响应。我采取的两种方法有什么不同?为什么第一种方法失败了?

第一种方法

subprocess.call(["build", "-u"], cwd=cwd, stdout=f, stderr=f, shell=False, executable=exe)

失败并返回:错误:没有这样的选项:-u

第二种方法

subprocess.call([exe, "build", "-u"], cwd=cwd, stdout=f, stderr=f, shell=False)

工作并贯穿整个过程。

exe存储"sam.exe"的路径

当您调用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"])

这是您的工作代码。

来自Popen的文档字符串

executable:要执行的替换程序。

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

从代码的更下方

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

因此CCD_ 18标志指定使用哪个程序并运行该命令。默认情况下,使用shell运行,但您可以指定不同的方式。

最新更新