使用Python访问已在运行的进程 [英] Accessing an ALREADY running process, with Python

查看:0
本文介绍了使用Python访问已在运行的进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

背景:

  • 操作系统: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

这篇关于使用Python访问已在运行的进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆