subprocess.Popen:如何将列表作为参数传递

19

我只需要一点提示,知道如何正确地做事。

比方说我有一个名为 script.py 的脚本,它使用一个名字列表作为参数 ["name1", "name2"等]。

我想使用 subprocess 模块从另一个脚本调用这个脚本。我想要做的是:

myList = ["name1", "name2", "name3"]
subprocess.Popen(["python", "script.py", myList])

当然那行不通,因为subprocess.Popen方法需要以字符串列表形式提供参数。 因此我考虑采取以下做法:

subprocess.Popen(["python", "script.py", str(myList)])

现在流程已经开始,但由于参数为字符串而不是列表,所以无法正常工作。我应该如何正确修复它?

2个回答

40

使用+运算符将它们连接起来。

myList = ["name1", "name2", "name3"]
subprocess.Popen(["python", "script.py"] + myList)

顺便提一下,如果你想使用相同的 Python 程序,请用 sys.executable 替换 "python"


如果您不确定附加参数的类型,请使用.extend() - Niklas R
@NiklasR,或者 + list(myList) - falsetru
1
只有在调用之前修改命名列表时,extend 才有用。subprocess.Popen(["python", "script.py"].extend(myList)) 会将 None(即 extend 的返回值)作为第一个且唯一的参数传递给 Popen() - chepner
@user5319825,是的,正如您在答案中的代码所看到的那样。子进程可以使用sys.argv接收这些命令行参数。 - falsetru
我想从正在执行的进程传递一个参数到稍后要启动的进程(显然是下一个即将到来的进程)。 - user5319825
显示剩余2条评论

4
感谢falsetru的快速回答。虽然它不能直接工作,但我明白了如何做。 您的建议等同于执行以下操作:
subprocess.Popen(["Python","script.py","name1","name2","name3"])

我有3个参数,它们是包含在我的原始列表中的字符串。

在我的script.py文件中,我只需要通过以下方式从接收到的每个参数构建新列表:

myList = sys.argv[1:]

现在myList与我最初的那个相同了!

["name1","name2","name3"]

我不知道为什么之前没有想到这个!

该内容与IT技术无关。

我使用extend将更多元素添加到列表中,这是对我最有效的方法。由于在调用subprocess.Popen()之前仍需决定要添加什么到列表中,因此extend非常方便。 - daparic
感谢您...在 if name == 'main': 后面加上 myList = sys.argv[1:] - Abolfazl Rastgou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接