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

使用Python访问已经运行的进程,python,process,operating-system,maya,Python,Process,Operating System,Maya,问题:有没有一种方法可以使用Python访问正在运行的进程的标准输出?Python尚未启动此过程 上下文:有一个名为mayabatch的程序,用于渲染3D Maya场景文件中的图像。如果我从命令行运行程序,我将看到来自mayabatch的进度消息。有时,艺术家会关闭这些窗口,在程序完成之前无法跟踪进度。这让我走上了这条路,试图在它被一个外来进程生成后读取它的标准输出 背景: 操作系统:Windows 7 64位 到目前为止我的研究:我只找到了关于如何使用子流程模块在子流程中执行此操作的问题和

问题:有没有一种方法可以使用Python访问正在运行的进程的标准输出?Python尚未启动此过程

上下文:有一个名为mayabatch的程序,用于渲染3D Maya场景文件中的图像。如果我从命令行运行程序,我将看到来自mayabatch的进度消息。有时,艺术家会关闭这些窗口,在程序完成之前无法跟踪进度。这让我走上了这条路,试图在它被一个外来进程生成后读取它的标准输出

背景:

  • 操作系统:Windows 7 64位
到目前为止我的研究:我只找到了关于如何使用
子流程
模块在子流程中执行此操作的问题和答案。我还简要地查看了
psutil
,但我找不到任何方法来读取进程的stdout

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

我想你做不到

延迟的方法是将
mayabatch
的输出通过管道传输到文本文件,然后在您自己的代码中定期轮询文本文件,这样它就在您的控制之下,而不是强迫您等待管道(这在Windows上尤其困难,因为Windows不使用子进程使用的管道)

我认为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]
可以工作,但在进程结束之前不会报告。但您在进程的标准输出上调用
readlines
,将触发进程并一次报告一行:

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

更多讨论

您可以使用一个带有已知端口的套接字,如果连接,则通过管道输出到它,不是吗?使用本机操作系统服务——这将是一个挑战,完全取决于您使用的操作系统。但听起来问题比这简单。听起来
mayabatch
有一种机制可以告诉您已经在运行的程序的状态…听起来像是一个命令行实用程序。为什么只编写它的执行脚本并解析它的输出?在Linux上你可以(某种程度上)使用
strace
执行此操作。也许有一个Windows等效软件?感谢您的所有输入。它们非常有用。感谢您像往常一样给出了一个很好的答案@theodox。我会尝试这些并让您知道。我非常确定这些是实现此目的的最佳方法。见鬼,怎么会让我发布两个相同的副本?至少在python中不起作用3:“AttributeError:'Popen'对象没有属性'subprocess'”