使用Python访问已在运行的进程已在、进程、Python

由网友(我会等你在人海中找到我)分享简介:问题:有没有办法使用Python访问正在运行的进程的stdout?此进程不是已由Python启动。上下文:有一个名为mayabatch的程序,可以从3D Maya场景文件中渲染图像。如果我从命令行运行该程序,我将看到来自mayabatch的进度消息。有时,艺术家会关闭这些窗口,直到程序结束才能跟踪进度。这让我走上了这条...

问题:有没有办法使用Python访问正在运行的进程的stdout?此进程不是已由Python启动。

上下文:有一个名为mayabatch的程序,可以从3D Maya场景文件中渲染图像。如果我从命令行运行该程序,我将看到来自mayabatch的进度消息。有时,艺术家会关闭这些窗口,直到程序结束才能跟踪进度。这让我走上了这条路,试图在它被外部进程产生后读取它的stdout。

python程序是如何运行的

背景:

操作系统:Windows 7 64位

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

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

推荐答案

我认为您不能get to the stdout of a process outside of the code that created it

懒惰的方法是将mayabatch的输出通过管道传输到文本文件,然后在您自己的代码中定期轮询文本文件,使其处于您的控制之下,而不是强迫您等待管道(这在Windows上尤其困难,因为Windowsselect不能与子进程使用的管道一起工作。

我认为这也是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]

有效,但在进程结束之前不会报告。但在进程的stdout上调用readlines将触发该进程,并一次报告一行:

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

更多讨论here

阅读全文

相关推荐

最新文章