使用Python访问ALREADY正在运行的进程

时间:2014-12-19 20:24:16

标签: python process operating-system maya

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

上下文:有一个名为 mayabatch 的程序,用于渲染3D Maya场景文件中的图像。如果我从命令行运行程序,我会看到来自 mayabatch 的进度消息。有时,艺术家关闭这些窗口,使得进度无法进行,直到程序结束。这导致我沿着这条路线试图阅读它的标准,因为它是由外国过程产生的。

背景

  • 操作系统:Windows 7 64位

到目前为止我的研究:我只是使用subprocess模块找到了如果这是一个子流程的问题和答案。我还简要介绍了psutil,但我找不到任何方法来阅读流程'标准输出。

任何帮助都会非常感激。谢谢。

1 个答案:

答案 0 :(得分:4)

我认为你不能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中做到这一点,除非你不介意让你的python脚本闲置直到mayabatch完成,否则它会更加困难。通常的子进程配方使用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