2017-05-28 55 views
0

我有一個名爲program的編譯程序,它需要一個名爲2phase_eff的參數。我想從python運行此程序,但也能夠實時查看shell的進度(它會輸出各種進度消息)。到目前爲止,我已經成功地在實際運行它,它是做使用下面的代碼運行後觀察輸出:獲取子進程模塊以啓動shell窗口

import subprocess 
subprocess.Popen("program 2phase_eff", stdout=subprocess.PIPE, shell=True).communicate() 

是的,這確實輸出的所有中間的東西在最後,但這裏有兩個問題

  1. 我不能看到cmd外殼和
  2. 輸出是不是實時

我如何可以調整上述命令履行AB兩個目標?謝謝。

+0

你正在使用哪個操作系統? – Gahan

+0

我正在使用Windows 7 – user32882

+0

相關https://stackoverflow.com/questions/803265/getting-realtime-output-using-subprocess – stovfl

回答

0

要顯示命令shell,您需要將creationflags的值傳遞給subprocess.Popen()的調用。在Windows中,這是ShellExecute()nShowCmd參數。它是一個介於010之間的整數。 Popen()的默認值爲零,相當於SW_HIDE。您可以在https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx找到可用值的完整列表。

缺少實時輸出是使用Popen.communicate()stdout=subprocess.PIPE組合的結果。輸出緩衝在內存中,直到子進程完成。這是因爲.communicate()會返回輸出結果,直到方法調用返回時纔會得到結果。

您可以嘗試將文件描述符傳遞給它並輪詢。

+0

那麼我應該用什麼結束命令來達到預期的效果? – user32882

+0

@ user32882:我無法回答,因爲我不知道期望的結果是什麼。 'Popen.communicate()'等到子進程完成。所以如果你想在這之前看到輸出,不要管輸出。你做什麼取決於你想要什麼。你可以改變你的命令爲''program 2phase_eff「> myfile.txt'而不是'stdout'。你問了一個調整。真的沒有一個。 – BoarGules