Accessing an ALREADY running process, with Python(使用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访问已在运行的进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用Python访问已在运行的进程
基础教程推荐
- 如何防止Groupby超越指数? 2022-09-22
- 在OpenCV中放大后,Python会捕捉图像的特定部分 2022-09-22
- 获取多索引中某个级别的最后一个元素 2022-09-22
- 跟在带量词的前瞻后面有什么作用? 2022-09-22
- 使用工作区API导入方法导入数据库笔记本(动态内 2022-09-21
- 如何在hdf5文件的多个组之间拆分数据? 2022-09-21
- 从顶点坐标创建三角网格 2022-09-21
- 在 pandas 中使用带有多重索引的.loc 2022-09-22
- 如何将RPC与Volttron配合使用 2022-09-21
- Python h5py-为什么我收到广播错误? 2022-09-21