python stdout stderr 一起输出_合并Python脚本的子进程stdout和stderr,同时保持它们的区别...

我发现自己最近不得不解决这个问题,而且花了一段时间才得到一些我觉得在大多数情况下都能正常工作的东西,所以就这样!(它还具有通过python记录器处理输出的良好副作用,我注意到这是Stackoverflow中的另一个常见问题)。

代码如下:import sys

import logging

import subprocess

from threading import Thread

logging.basicConfig(stream=sys.stdout,level=logging.INFO)

logging.addLevelName(logging.INFO+2,'STDERR')

logging.addLevelName(logging.INFO+1,'STDOUT')

logger = logging.getLogger('root')

pobj = subprocess.Popen(['python','-c','print 42;bargle'],

stdout=subprocess.PIPE, stderr=subprocess.PIPE)

def logstream(stream,loggercb):

while True:

out = stream.readline()

if out:

loggercb(out.rstrip())

else:

break

stdout_thread = Thread(target=logstream,

args=(pobj.stdout,lambda s: logger.log(logging.INFO+1,s)))

stderr_thread = Thread(target=logstream,

args=(pobj.stderr,lambda s: logger.log(logging.INFO+2,s)))

stdout_thread.start()

stderr_thread.start()

while stdout_thread.isAlive() and stderr_thread.isAlive():

pass

输出如下:STDOUT:root:42

STDERR:root:Traceback (most recent call last):

STDERR:root: File "", line 1, in

STDERR:root:NameError: name 'bargle' is not defined

您可以替换子进程调用来执行任何您想要的操作,我只是选择了使用一个命令来运行python,我知道该命令将同时打印到stdout和stderr。关键位是在一个单独的线程中读取stderr和stdout。否则,当另一个数据准备好读取时,可能会阻塞一个数据的读取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值