繁体   English   中英

使用Python访问已运行的进程

[英]Accessing an ALREADY running process, with Python

问题:有没有一种使用Python的方法来访问正在运行的进程的标准输出? 这个过程尚未被Python启动。

上下文:有一个名为mayabatch的程序,该程序可从3D Maya场景文件中渲染图像。 如果我要从命令行运行程序,我会看到mayabatch的进度消息。 有时,艺术家会关闭这些窗口,直到程序完成之前,进度都无法控制。 这导致我沿这条路线尝试在被外部程序生成后读取其标准输出。

背景:

  • 作业系统:Windows 7 64-bit

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

任何帮助将非常感激。 谢谢。

我认为您无法在创建该程序的代码之外获得该程序的标准输出

懒惰的方法是将mayabatch的输出通过管道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]

可以工作,但要等到过程终止后才能报告。 但是,您在流程的stdout上调用readlines将触发该流程并一次报告一行:

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

这里有更多讨论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM