[英]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.