将多个并行进程的输出重定向到日志文件和标准输出,而不等待进程终止

时间:2016-04-29 18:53:40

标签: python logging process subprocess popen

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

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

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

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

是否有其他方法可以将输出捕获到日志文件中的stdout,同时将实时输出传输到stdout?

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用像sarge这样的第三方库(披露:我是维护者),它允许你打开多个子进程,捕获它们的输出流,一次读取一行,用这些线做你想做的事。您需要了解流程缓冲问题等事项 - 查看文档的this section以获取更多信息。

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