【问题标题】:Catching logger.info output in python subprocess?在 python 子进程中捕获 logger.info 输出?
【发布时间】:2020-05-23 03:49:12
【问题描述】:

hello.py:

import logging
logging.info("hello, I am a log")

wrapper.py:

import subprocess
from subprocess import PIPE

result = subprocess.run('python ./hello.py'.split(' '), stdout=PIPE, stderr=PIPE, universal_newlines=True)
print(f'returncode: {result.returncode}')
print(f'stdout: {result.stdout}')
print(f'stderr: {result.stderr}')

当我打电话给python wrapper.py 时,我希望看到这个输出:

returncode: 0
stdout: INFO:root:hello, I am a log
stderr: 

但是,我得到了这个输出:

returncode: 0
stdout:
stderr: 

而且,如果我用logger.warning() 替换logging.info(),那么我会得到这个输出:

returncode: 0
stdout:
stderr: WARNING:root:hello, I am a log

但是,我有一堆带有logging.info 的代码,我想把它引入一个python 子进程。我该怎么做?


最后的笔记:

  • 我想大多数人会更愿意通过import hello 拨打hello.py,但假设在这种情况下这不是一个选项。
  • 我使用的是 Python 3.8。

【问题讨论】:

  • 在 hello.py 中以 logging.getLogger().setLevel(logging.INFO) 开头:docs.python.org/3/library/logging.html#logging.Logger.setLevel
  • 顺便说一句,您在使用 info() 时看不到输出,因为它没有被打印——如果这是您问题的一部分。
  • 正如 petre 指出的那样,这与子流程无关。默认的日志记录级别是警告,下面的任何内容都不会出现。
  • @petre 你是对的。我没有意识到除非您更改级别,否则不会打印 INFO。如果您输入它作为答案,我会接受。

标签: python python-3.x logging subprocess


【解决方案1】:

好的,让我们为未来的潜在读者提供答案。

logging.getLogger().setLevel(logging.INFO) 添加到hello.py。正如用户布鲁斯指出的那样,默认的日志记录级别是警告。因此,当您使用不会产生任何输出的logging.info() 时,这就是您看不到它的原因。

https://docs.python.org/3/library/logging.html#logging.Logger.setLevel查看更多信息

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2018-04-12
    • 2011-02-01
    • 2011-08-25
    相关资源
    最近更新 更多