簡體   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