子过程输出到PIPE并直接输出到stdout

我发现了一些类似于我的问题,但没有提供我可以使用的解决方案(最接近的是:子过程输出到标准输出和PIPE)

问题:我想使用需要很长时间的子进程启动一个进程。 运行命令后,我需要解析stdout-output和stderr-output。

目前我做如下:

p = subprocess.Popen( command_list, stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE )
out, error_msg = p.communicate()
print out + "nn" + error_msg

#next comes code in which I check out and error_msg

但是这种方法的缺点是用户在运行时没有看到进程的输出。 只有在输出结束时才打印。

有没有办法在命令运行时打印输出(就像我没有执行stdout / stderr = subprocess.PIPE命令一样),并且最终还是通过p.communicate输出输出?

注意:我目前正在开发Python 2.5(使用此Python版本的旧软件版本)。


这段代码曾经帮助我处理过类似的情况:

process = subprocess.Popen(cmd, bufsize=1, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, ''):
    print line,
    sys.stdout.flush() # please see comments regarding the necessity of this line 
process.wait()
errcode = process.returncode

使用| tee | tee

import subprocess

# Run command and redirect it by | tee to a file named out.txt 
p = subprocess.Popen([command, '|', 'tee', 'out.txt'])
p.wait()

# Get standard output
f = open('out.txt')
out = f.read()
f.close()

print out

在Windows平台上,没有| tee | tee 。 我们需要使用Powershell。 所以第三行的命令变成:

# Run command in PowerShell and redirect it by | tee to a file named out.txt 
p = subprocess.Popen(['powershell','command, '|', 'tee', 'out.txt'])

通过这种方式,打印输出并且输出也将被存储在输出中。

链接地址: http://www.djcxy.com/p/13481.html

上一篇: Output of subprocess both to PIPE and directly to stdout

下一篇: when is 'commands' preferable to 'popen' subprocess?