sh python模块如何记录stderr/stdout并只捕获stdout?

2024-04-26 12:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

使用sh模块,我想log处理的stdout/stderr并捕获stdout进行处理。这个过程可能需要很长时间,日志记录不能等到过程完成,这样用户才能实时看到输出。你知道吗

下面的代码可以很好地记录stdout/stderr。但是stdout和stderr是混合的,没有方便的方法将两者分开。你知道吗

import sh
import logging

logger = logging.getLogger(__name__)

command = sh.bash('-c', 'echo a; echo b >&2', _iter=True, _err_to_out=True)

for line in command:
    logger.error(line)

print(command.stdout)

输出如下:

a
b
b'a\nb\n'

有没有一种方法可以做同样的事情,但是不混合stdoutstderr?你知道吗


Tags: 模块方法importechologtrue过程logging
1条回答
网友
1楼 · 发布于 2024-04-26 12:41:53

解决方案是将_out_err设置为所需的日志函数(例如logging.error)。当从stderrstdout读取新行时,将立即调用它,并以增量方式向用户显示输出。你知道吗

但是,当设置_out_err时,sh不收集输出,并且不可用于处理。这就是_tee=True的用途:它收集stdoutstderr,即使设置了_out_err。你知道吗

import sh
import logging

logger = logging.getLogger(__name__)

command = sh.bash('-c', 'echo a; echo b >&2',
                  _tee=True,
                  _out=lambda x: logger.error(x.strip()),
                  _err=lambda x: logger.error(x.strip()))

print(command.stdout)

输出为

a
b
b'a\n'

相关问题 更多 >