我一直在尝试运行 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/