[英]Redirect the output of multiple parallel processes to both a log file and stdout without waiting until the processes terminate
我想将从python脚本开始的(可能有多个)进程的输出重定向到stdout和日志文件,就像unix工具tee
一样。 A该过程相当持久,我想在打印时显示/记录该行。 行缓冲是可以的,但是在将任何内容打印到stdout之前等待该过程完成是不可行的。
不过,我找不到实现该目标的方法。 查看subprocess.Popen()
我看到可以将输出从stdout转发到管道,文件描述符或文件对象。 似乎我必须等到进程结束,再调用communicate()
从管道读取数据。 我既没有文件描述符,也没有伪造文件对象,因为Popen似乎需要真实的文件。
到目前为止,我所知道的唯一解决方案是按照Python Popen的建议从Popen逐行读取:同时写入stdout和日志文件 。 但是,这仅适用于单个过程。 我想处理从python脚本启动的多个进程,所有进程都应打印到stdout并放入同一日志。
我特别专注于使用subprocess.Popen
。 通过让回调完成工作,Qt的QProcess
似乎是一个潜在的解决方案,但是不幸的是我没有GUI应用程序,而且我不知道如何在线性执行的python脚本中运行Qt事件循环。
还有其他方法可以将输出捕获到日志文件中的stdout并同时将输出实时输出到stdout吗?
谢谢!
您可以使用第三方库,例如sarge
(公开:我是维护者),该库允许您打开多个子流程,捕获其输出流,一次从它们中读取一行并使用这些行来完成您想要的事情。 您需要了解诸如进程缓冲问题之类的内容-有关更多信息,请参阅文档的本部分 。
更新:针对您的评论-是的,使用sarge您可以启动多个进程(使用async=True
),然后您必须在父进程中主动轮询其输出流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.