【问题标题】:Capture logging output using subprocess.check_output in Python在 Python 中使用 subprocess.check_output 捕获日志输出
【发布时间】:2020-08-27 23:22:13
【问题描述】:

我正在运行一个 Telegram 机器人,它基本上是我制作的贝叶斯分类器的接口。我发出命令在远程服务器上开始测试,测试人员最初使用logging 模块将有关测试的信息打印到标准输出。当我尝试通过subprocess.check_output 生成子进程时,我注意到 stdout 和 stderr 都在空字节字符串中。我通过用print 函数替换最后一个真正重要的logging.info 调用来解决这个问题。我猜logging 不会写在subprocess.check_output 期望的相同标准输出上?我做错了吗?

编辑

如被问及,我正在添加更多关于我实际运行的代码的上下文。我不知道这是否重要,但为了完整起见,我会补充一点,我用来运行机器人的框架是 pyrogram。

机器人调用的测试器可以找到here,而调用该脚本的机器人代码是here

【问题讨论】:

  • 如果您在终端中“按原样”运行应用程序,您能看到日志消息吗?
  • 是的,我知道,实际上当 subprocess.check_output 运行时,我在终端中看到了日志,但模块似乎看不到它们
  • 能把这个问题的相关代码加进去吗? subprocess._check_output 设置以及关于生成输出位置的代码。

标签: python logging subprocess bots


【解决方案1】:

我猜是日志不会写入 subprocess.check_output 所期望的相同标准输出?

logging 根本不写入标准输出(默认情况下);它写入标准错误。

您需要通过添加stderr 参数将您的stderr 重定向到stdout,例如:subprocess.check_output(..., stderr=subprocess.STDOUT),或者您需要使用其他子进程函数之一,例如run,它可以访问stderr。

文档确实说:

调用子流程的推荐方法是对它可以处理的所有用例使用 run() 函数

【讨论】:

  • 当你说你注意到 stderr 是一个空字节字符串时,我不确定你会在哪里寻找,因为 check_output 只返回 stdout。 check_output 在其参数签名中默认设置了 stderr=None,因此它丢弃了 stderr。使用 check_output 捕获标准错误的过程记录在此处的函数描述中 docs.python.org/3/library/…
  • 是的,你是对的,它只是标准输出,反正我不知道日志记录实际上写入标准错误,将尝试看看这是否能解决问题,谢谢!
猜你喜欢
  • 2014-09-11
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2020-05-20
  • 2022-12-01
  • 2014-05-23
  • 2021-09-30
相关资源
最近更新 更多