【问题标题】:how can the sh python module log stderr/stdout and only capture stdout?sh python 模块如何记录标准错误/标准输出并只捕获标准输出?
【发布时间】:2019-05-11 15:07:35
【问题描述】:

使用sh模块,我想log进程的stdout/stderr并捕获stdout进行处理。该过程可能需要很长时间,并且记录不能等到该过程完成,以便用户实时看到输出。

以下内容可以很好地记录标准输出/标准错误。但是 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

【问题讨论】:

  • 就像 _err_to_out=False 一样简单,反正这是该变量的默认值 :) @singuliere
  • 如果 _err_to_out 为 false,stderr 将不会被记录

标签: python sh


【解决方案1】:

解决方案是将_out_err 设置为所需的日志记录功能(例如logging.error)。只要从stderrstdout 读取新行,就会调用它,并且将逐步向用户显示输出。

但是,当设置了_out_err 时,sh 不会收集输出并且将无法进行处理。这就是_tee=True 的用途:即使设置了_out_err,它也会收集stdoutstderr

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'

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 2013-05-11
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多