【发布时间】: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 事件循环。
有没有其他方法可以将输出捕获到日志文件中的标准输出,同时实时输出到标准输出?
谢谢!
【问题讨论】:
-
“也不起作用” 不提供信息。您尝试过什么同时运行多个进程(
threading、asyncio)?你期望会发生什么?反而发生了什么?一步一步描述。 -
这不是错误报告。我正在寻求概念上的帮助。如果您阅读了我引用的问题 (stackoverflow.com/a/15535389/1557304) 中的建议解决方案,您会发现这仅适用于单个进程。我还没有找到接收多个进程输出的解决方案。
-
我更新了我的问题以描述我到目前为止所做的尝试。
-
如果你需要一个代码示例然后follow links mentioned in this question例如,很容易修改
teed_call()函数来启动多个进程,甚至更容易使用asyncioversion启动多个进程 -
我更新了我的答案以解决您的评论。
标签: python logging process subprocess popen