使用python的子进程同时捕获和输出stderr

时间:2012-10-14 20:16:38

标签: python subprocess pipe stdout stderr

(目前使用python 3.2)

我需要能够:

  • 使用子流程运行命令
  • 该命令的stdout / stderr都需要实时打印到终端(如果它们都出现在stdout或stderr或其他什么地方都没关系
  • 与此同时,我需要一种方法来了解命令是否将任何内容打印到stderr(最好是打印出来的内容)。

我玩过子进程管道以及在bash中进行奇怪的管道重定向,以及使用tee,但是还没有找到任何可行的东西。这是可能的吗?

2 个答案:

答案 0 :(得分:1)

我的解决方案:

import subprocess

process = subprocess.Popen("my command", shell=True,
                           stdout=None, # print to terminal
                           stderr=subprocess.PIPE)
duplicator = subprocess.Popen("tee /dev/stderr", shell=True, # duplicate input stream
                              stdin=process.stderr, 
                              stdout=subprocess.PIPE, # catch error stream of first process
                              stderr=None) # print to terminal
error_stream = duplicator.stdout
print('error_stream.read() = ' + error_stream.read())

答案 1 :(得分:0)

尝试这样的事情:

import os

cmd = 'for i in 1 2 3 4 5; do sleep 5; echo $i; done'
p = os.popen(cmd)

while True:
    output = p.readline()
    print(output)
    if not output: break

在python2中,您可以使用popen3这样轻松捕获stderr:

i, o, err = os.popen3(cmd)

但是在python3中似乎没有这样的功能。如果您没有找到解决方法,请尝试直接使用subprocess.Popen,如下所述:http://www.saltycrane.com/blog/2009/10/how-capture-stdout-in-real-time-python/