[英]Accessing an ALREADY running process, with Python
问题:有没有一种使用Python的方法来访问正在运行的进程的标准输出? 这个过程尚未被Python启动。
上下文:有一个名为mayabatch的程序,该程序可从3D Maya场景文件中渲染图像。 如果我要从命令行运行程序,我会看到mayabatch的进度消息。 有时,艺术家会关闭这些窗口,直到程序完成之前,进度都无法控制。 这导致我沿这条路线尝试在被外部程序生成后读取其标准输出。
背景:
到目前为止,我的研究是:我仅使用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.