我一直在尝试运行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运行,但您可以指定不同的方式。