【问题标题】:Can't read stderr from subprocess.Popen无法从 subprocess.Popen 读取标准错误
【发布时间】:2011-08-10 19:06:28
【问题描述】:

我想启动一个子进程并读取它的 stderr,但到目前为止,我无法使用 subprocess.Popen 读取任何内容,甚至 stdout。我正在尝试使用 subprocess.communicate() 从标准输出和标准错误中读取。我就是这样做的:

import subprocess
p = subprocess.Popen('ls')
s = p.communicate()
print s

这给了我输出(无,无)。我认为这对适用于标准输入和标准错误。是这样吗?无论如何,如何从以 subprocess.Popen 开始的进程中读取 stdout 和 stderr?

【问题讨论】:

标签: python subprocess


【解决方案1】:

您需要在创建 Popen 对象时指定 stdout=subprocess.PIPE 和 stderr=subprocess.PIPE:

  p = subprocess.Popen('ls', stdout=subprocess.PIPE, stderr=subprocess.PIPE)

【讨论】:

    【解决方案2】:

    来自 Python 文档(子流程模块):

    Popen.communicate(input=None) 
    

    与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件结尾。等待进程终止。可选的输入参数应该是要发送到子进程的字符串,或者如果不应该向子进程发送数据,则为 None。

    communicate() 返回一个元组(stdoutdata,stderrdata)。

    注意,如果你想向进程的标准输入发送数据,你需要使用stdin=PIPE创建Popen对象。同样,要在结果元组中获取除None 以外的任何内容,您也需要提供stdout=PIPE 和/或stderr=PIPE

    【讨论】: