使用Python访问已经运行的进程

2024-05-15 02:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:是否有方法使用Python访问正在运行的进程的stdout?这个过程是Python启动的。在

上下文:有一个名为mayabatch的程序,可以从3D Maya场景文件渲染出图像。如果我从命令行运行程序,我会看到来自mayabatch的进度消息。有时,艺术家会关闭这些窗口,直到程序完成,进度无法追踪。这让我尝试在一个外来进程产生它的stdout之后读取它。在

背景:

  • 操作系统:Windows 7 64位

到目前为止,我的研究:我只找到了一些问题和答案,如果它是一个子流程,使用subprocess模块来完成。我还简单地研究了psutil,但我找不到任何读取进程的标准输出的方法。在

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


Tags: 文件方法命令行图像程序消息进程过程
1条回答
网友
1楼 · 发布于 2024-05-15 02:20:27

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

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

我认为这也是maya在内部所做的:默认情况下,mayaBatch将其结果记录到用户的maya目录中名为mayaRenderLog.txt的文件中。在

如果从命令行或bat文件运行mayabatch,则可以将stdout漏斗到带有>字符的文件:

  mayabatch.exe "file.ma" > log.txt

您应该能够使用标准python从外部轮询该文本文件,只要您只打开它进行阅读。这样做的好处是可以控制检查文件的频率。在

如果您是从python中执行的,则会有点困难,除非您不介意在mayabatch完成之前让python脚本处于空闲状态。通常使用popen.communicate()的子进程配方将等待进程结束返回代码:

^{2}$

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

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

更多讨论here

相关问题 更多 >

    热门问题