我想将从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?
谢谢!
答案 0 :(得分:1)
你可以使用像sarge
这样的第三方库(披露:我是维护者),它允许你打开多个子进程,捕获它们的输出流,一次读取一行,用这些线做你想做的事。您需要了解流程缓冲问题等事项 - 查看文档的this section以获取更多信息。
更新:在回复您的评论时 - 是的,使用sarge可以启动多个进程(使用async=True
),然后您必须在父进程中主动轮询其输出流