我一直在尝试运行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”的路径
答案 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
标志指定要使用和运行命令的程序。默认情况下使用外壳程序运行,但是您可以指定不同的方式。