【问题标题】:Python subprocess passes one argument onlyPython 子进程只传递一个参数
【发布时间】:2014-07-27 10:51:15
【问题描述】:

我有一个 Python 脚本 (2.7),我用它来调用外部进程。直到最近它运行良好。

但现在当我运行它时,我发现它没有传递进程参数。我还调试了调用的进程,它只接收单个参数(进程可执行文件的路径)。

p = subprocess.Popen(["./myapp","-p","s"],shell=True)
p.communicate()

上述代码的执行只传递“myapp”作为命令参数。为什么会发生这种情况?

【问题讨论】:

    标签: python linux python-2.7


    【解决方案1】:

    使用shell=True时,只需传递一个字符串(不是列表);

    p = subprocess.Popen('./myapp -p s', shell=True)
    p.communicate()
    

    更新

    总是喜欢;

    • shell=False(默认)到shell=True并传递一个字符串数组;和
    • 可执行文件的绝对路径,而不是相对路径。

    即;

    with subprocess.Popen(['/path/to/binary', '-p', 's']) as proc:
        stdout, stderr = proc.communicate()
    

    如果您只对stdout(而不是stderr)感兴趣,请选择此解决方案而不是上述解决方案(它更安全、更短):

    stdout = subprocess.check_output(['/path/to/binary', '-p', 's'])
    

    【讨论】:

    • 虽然这是公认的答案,但总是更喜欢shell=False(即默认值)。对于程序输入、程序代码和运行环境的变化,它更加安全且更具弹性。请参阅 Python 子流程文档。
    【解决方案2】:

    不要使用shell=True:

    p = subprocess.Popen(["./myapp","-p","s"])
    p.communicate()
    

    【讨论】:

    • 我更喜欢这个答案。它比将 shell 脚本嵌入到 Python 程序中更强大。此外,在这种情况下,您可能不需要调用 shell。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2016-12-16
    • 2018-04-16
    相关资源
    最近更新 更多