无法从subprocess.Popen读取stderr

3 投票
2 回答
3272 浏览
提问于 2025-04-16 16:13

我想启动一个子进程,并读取它的错误输出(stderr),但是到目前为止,我用subprocess.Popen根本无法读取任何内容,包括标准输出(stdout)。我尝试用subprocess.communicate()来读取标准输出和错误输出。我的做法是这样的:

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

这样做后,我得到的结果是(None, None)。我觉得这对结果是表示标准输入(stdin)和错误输出(stderr)。是这样吗?不管怎样,我该如何从用subprocess.Popen启动的进程中读取标准输出和错误输出呢?

2 个回答

1

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

Popen.communicate(input=None) 

与进程进行交互:可以向标准输入(stdin)发送数据,从标准输出(stdout)和标准错误(stderr)读取数据,直到文件结束为止。然后等待进程结束。可选的输入参数应该是一个字符串,这个字符串会发送给子进程。如果不想发送数据给子进程,可以设置为None。

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

注意,如果你想向进程的标准输入发送数据,需要在创建Popen对象时使用 stdin=PIPE。同样,如果你想在结果元组中得到其他内容,而不是None,也需要设置 stdout=PIPE 和/或 stderr=PIPE

4

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

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

撰写回答