2010-06-08 47 views
16

我正在嘗試編寫一個使用subprocess模塊的小應用程序。使用子進程wait()和poll()

我的程序調用需要一些時間來處理的外部Bash命令。在此期間,我想向用戶展示如下一系列消息:

正在處理。請稍候...
輸出爲FOO()

我怎樣才能做到這一點使用Popen.wait()Popen.poll()。我讀過,我需要使用Popen.returncode,但我怎麼能得到它主動檢查狀態,我不知道。

回答

16

兩個 wait()(與 timeout指定)和 poll()回報 None如果進程尚未完成,而不同的東西,如果 的處理結束(我認爲一個整數,退出代碼,希望0)。

編輯

wait()poll()有不同的行爲:

  • wait(無超時參數)會阻塞,等待過程來完成。
  • wait with the timeout argument will wait timeout seconds for the process to complete。如果沒有完成,它會拋出TimeoutExpired異常。如果您發現異常,歡迎您繼續,或再次登錄wait
  • poll總是立即返回。它有效地等待,等待時間爲0,捕獲任何異常,並且如果過程尚未完成,則返回None
  • 無論使用哪種waitpoll,如果該進程已經完成,POPEN對象的returncode將被設置(否則就沒有 - 你可以作爲很容易地檢查作爲調用waitpoll),並從函數的返回值也將是進程的返回碼。

< /編輯>

所以我認爲你應該這樣做:

while myprocess.poll() is None: 
    print("Still working...") 
    # sleep a while 

注意,如果在bash腳本創建大量的輸出,你必須使用communicate()什麼類似於阻止stdoutstderr成爲塞。

+0

我使用的是溝通()。但是我不知道如何在進程執行時返回返回碼。 – user225312 2010-06-08 09:43:50

+0

我解決了這個問題:if process.poll()is None:print'Working' – user225312 2010-06-08 09:47:41

+4

這個答案是錯誤的。檢查@ onlynone的回答 – 2015-05-15 14:29:55

23

@ extraneon的回答有點落後。如果過程完成,wait()poll()都會返回進程的退出代碼。該poll()方法將返回None如果進程仍在運行和wait()方法將阻塞,直到進程退出:

請查看以下頁面:https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

檢查子進程終止。設置並返回returncode屬性。

Popen.wait()

等待子進程終止。設置並返回returncode屬性。

相關問題