【问题标题】:Redirect the output of multiple parallel processes to both a log file and stdout without waiting until the processes terminate将多个并行进程的输出重定向到日志文件和标准输出,而无需等到进程终止
【发布时间】:2016-08-25 01:01:06
【问题描述】:

我想将从 python 脚本中启动的(可能多个)进程的输出重定向到标准输出和日志文件,就像 unix 工具 tee 所做的那样。一个过程相当持久我想在打印时显示/记录该行。行缓冲是可以的,但在将任何内容打印到标准输出之前等待进程完成不是一个选项。

但我找不到实现这一目标的方法。查看subprocess.Popen() 时,我发现我可以将输出从标准输出转发到管道、文件描述符或文件对象。看来我必须等到进程结束时调用communicate() 从管道读取。我既没有文件描述符,也没有伪造文件对象,因为 Popen 似乎需要一个真实文件。

到目前为止,我知道的唯一解决方案是按照Python Popen: Write to stdout AND log file simultaneously 中的建议从 Popen 中逐行读取。但是,这仅适用于单个进程。 我想处理从 python 脚本启动的多个进程,并且所有进程都应该打印到标准输出并打印到同一个日志中。

我特别专注于使用subprocess.Popen。 Qt 的QProcess 似乎是让回调完成这项工作的潜在解决方案,但不幸的是我没有 GUI 应用程序,而且我不知道如何在线性执行的 python 脚本中运行 Qt 事件循环。

有没有其他方法可以将输出捕获到日志文件中的标准输出,同时实时输出到标准输出?

谢谢!

【问题讨论】:

  • “也不起作用” 不提供信息。您尝试过什么同时运行多个进程(threadingasyncio)?你期望会发生什么?反而发生了什么?一步一步描述。
  • 这不是错误报告。我正在寻求概念上的帮助。如果您阅读了我引用的问题 (stackoverflow.com/a/15535389/1557304) 中的建议解决方案,您会发现这仅适用于单个进程。我还没有找到接收多个进程输出的解决方案。
  • 我更新了我的问题以描述我到目前为止所做的尝试。
  • 如果你需要一个代码示例然后follow links mentioned in this question例如,很容易修改teed_call()函数来启动多个进程,甚至更容易使用asyncio version启动多个进程
  • 我更新了我的答案以解决您的评论。

标签: python logging process subprocess popen


【解决方案1】:

您可以使用像 sarge 这样的第三方库(披露:我是维护者),它允许您打开多个子进程,捕获它们的输出流,一次读取一行并执行您想要的操作用那些线。您需要注意诸如进程缓冲问题之类的事情 - 请查看文档的 this section 以获取更多信息。

更新:响应您的评论 - 是的,使用 sarge 您可以启动多个进程(使用 async=True),然后您必须在父进程中主动轮询它们的输出流。

【讨论】:

  • 这是否意味着如果在 Python 中使用 sarge 启动两个进程,我可以在我的脚本中接收到这两个进程的输出?这是否也意味着我必须通过反复调用readline() 来主动轮询这两个进程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2014-11-03
  • 2011-04-20
相关资源
最近更新 更多