【问题标题】:Accessing an ALREADY running process, with Python使用 Python 访问已经运行的进程
【发布时间】:2015-02-18 19:43:20
【问题描述】:

问题:有没有办法使用 Python 访问正在运行的进程的标准输出?此进程没有由 Python 启动。

上下文:有一个名为 mayabatch 的程序,可以从 3D Maya 场景文件中渲染出图像。如果我从命令行运行程序,我会看到来自 mayabatch 的进度消息。有时,艺术家会关闭这些窗口,让进度无法追踪,直到程序完成。这导致我沿着这条路径尝试在它由外部进程产生后读取它的标准输出。

背景:

  • 操作系统:Windows 7 64 位

到目前为止我的研究:我只使用subprocess 模块找到了关于如何在子流程中执行此操作的问题和答案。我还简要查看了psutil,但我找不到任何方法来读取进程的标准输出。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你可以使用一个带有已知端口的套接字,如果连接了,则通过管道输出,不是吗?
  • 使用本机操作系统服务——这将是一个挑战,并且完全取决于您使用的操作系统。但听起来问题比这更简单。听起来mayabatch 有一种机制可以告诉您已经运行的程序的状态......听起来它是一个命令行实用程序。为什么只编写脚本执行并解析它的输出?
  • 在 Linux 上,您可以(在某种程度上)使用 strace 执行此操作。也许有一个 Windows 等价物?
  • 感谢您的所有意见。它们非常有用。

标签: python process operating-system maya


【解决方案1】:

我不认为你可以get to the stdout of a process outside of the code that created it

懒惰的方式是将mayabatch 的输出通过管道传输到文本文件,然后在您自己的代码中定期轮询文本文件,以便它在您的控制之下,而不是强迫您在管道上等待(在 Windows 上尤其困难,因为 Windows select 不适用于子进程使用的管道。

我认为这也是 maya 在内部执行的操作:默认情况下,mayaBatch 将其结果记录到用户 Maya 目录中名为 mayaRenderLog.txt 的文件中。

如果您从命令行或 bat 文件运行 mayabatch,您可以将 stdout 汇集到带有 > 字符的文件:

  mayabatch.exe "file.ma" > log.txt

您应该能够使用标准 python 从外部轮询该文本文件,只要您只打开它进行阅读。这样做的好处是您可以控制检查文件的频率。

OTOH 如果您是从 python 中执行此操作,则它会有点困难,除非您不介意在 mayabatch 完成之前让您的 python 脚本处于空闲状态。通常使用popen.communicate() 的子进程配方将等待进程结束返回码:

 test = subprocess.Popen(["mayabatch.exe","filename.mb"], stdout=subprocess.PIPE)
 print test.communicate()[0]

有效,但在进程终止之前不会报告。但是您在进程的标准输出上调用readlines 将触发进程并一次报告一行:

 test = subprocess.Popen(["mayabatch.exe","filename.mb"], stdout=subprocess.PIPE)
 reader = iter(test.subprocess.readlines, "")
 for line in reader:
     print line

更多讨论here

【讨论】:

  • 感谢@theodox 一如既往的出色回答。
  • 我会尝试这些并让您知道。我很确定这些是解决此问题的最佳方法。
  • 到底是怎么让我发布两个相同的副本?
  • 至少在 python3 中不起作用:“AttributeError: 'Popen' 对象没有属性 'subprocess'”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
相关资源
最近更新 更多