无法从subprocess.Popen中读取stderr

时间:2011-04-22 06:02:15

标签: python subprocess

我想启动一个子进程并读取它的stderr,但到目前为止,我根本无法使用subprocess.Popen读取任何内容,甚至是stdout。我正在尝试使用subprocess.communicate()从stdout和stderr读取。这就是我的工作:

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

这给了我输出(无,无)。我认为这对是stdin和stderr。是这样的吗?无论如何,我如何从subprocess.Popen开始的进程中读取stdout和stderr?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

Popen.communicate(input=None) 

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

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

请注意,如果要将数据发送到进程的stdin,则需要使用stdin=PIPE创建Popen对象。同样,要在结果元组中获取None以外的任何内容,您还需要提供stdout=PIPE和/或stderr=PIPE