无法从subprocess.Popen读取stderr

3

我希望启动一个子进程并读取其stderr输出,但是目前使用subprocess.Popen时无法读取任何内容,包括stdout。我尝试使用subprocess.communicate()从stdout和stderr读取数据。这是我的操作:

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

这给我输出 (None, None)。我认为这一对是用于 stdin 和 stderr 的。不管怎样,我该如何从使用 subprocess.Popen 启动的进程中读取 stdout 和 stderr?

这个关于subprocess模块的指南包含一个可能有用的部分:http://www.doughellmann.com/PyMOTW/subprocess/#working-with-pipes-directly - Josh Rosen
2个回答

4
您需要在创建Popen对象时指定stdout=subprocess.PIPE和stderr=subprocess.PIPE:
  p = subprocess.Popen('ls', stdout=subprocess.PIPE, stderr=subprocess.PIPE)

1

来自Python文档(Subprocess模块):

Popen.communicate(input=None) 

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接