【问题标题】:subprocess.Popen : how to pass a list as argumentsubprocess.Popen:如何将列表作为参数传递
【发布时间】:2013-11-10 02:48:01
【问题描述】:

我只需要一个关于如何正确做事的提示。

假设我有一个名为 script.py 的脚本,它使用名称列表作为参数 ["name1"、"name2" 等]。

我想使用 subprocess 模块从另一个脚本调用此脚本。所以我想做的是:

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

这当然行不通,因为 subprocess.Popen 方法需要一个字符串列表作为参数。 所以我考虑做以下事情:

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

现在该过程开始了,但它不起作用,因为它有一个字符串作为参数,而不是一个列表。我应该如何正确解决这个问题?

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    使用+ 运算符连接它们。

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

    顺便说一句,如果你想使用相同的python程序,请将"python"替换为sys.executable

    【讨论】:

    • .extend() 如果您不确定附加参数的类型。
    • @NiklasR,或+ list(myList)
    • extend 仅在您在调用之前修改命名列表时才有用。 subprocess.Popen(["python", "script.py"].extend(myList)) 会将Noneextend 的返回值)作为第一个也是唯一一个参数传递给Popen()
    • @falsetru,我们可以将新参数(就像我们传递给函数一样)从前一个进程传递给新的子进程吗?
    • @user5319825,是的,正如您在答案中的代码中看到的那样。子进程可以使用sys.argv接收这些命令行参数。
    【解决方案2】:

    感谢您的快速回答 falsetru。它不能直接工作,但我知道该怎么做。 你的建议相当于做:

    subprocess.Popen(["Python","script.py","name1","name2","name3"])
    

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

    我需要在我的 script.py 文件中做的就是通过执行以下操作从收到的每个参数构建一个新列表:

    myList = sys.argv[1:]
    

    myList 现在与我最初的相同!

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

    不知道为什么我没有早点考虑!

    【讨论】:

    • 对我有用的最佳方法是使用extend 将更多元素添加到列表中。 extend 派上用场了,因为在调用 subprocess.Popen() 之前我还需要决定要添加到列表中的内容
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2013-04-21
    • 2018-01-11
    • 1970-01-01
    • 2022-01-02
    • 2014-02-13
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多