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

标签 python subprocess

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

subprocess.Popen 函数中使用 executable 参数与将 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 stores the path to '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"])

这是你的工作代码。

关于python - 使用 subprocess.Popen 时,使用可执行参数与将 exe 路径作为命令中的第一项有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54190665/

相关文章:

Python 字符串 "Modifiers"

python - 如何制作一个排序的字典类?

python - 了解非 bool 运算符在 bool 值上的使用

python - 如何向子进程发送新命令

Python3/Linux - 在默认编辑器中打开文本文件并等待完成

Python:在国际号码上发送短信的脚本?

python - Mssql外键

python - 终止正在运行的子进程调用

python - subprocess.call() 在 Mac 和 Linux 上失败

python - 在Python中执行一个BASH命令——在同一个进程中