无法从subprocess.Popen读取stderr
我想启动一个子进程,并读取它的错误输出(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)