2017-04-07 143 views
8

我用Python中的subprocess.Popen啓動了一些子進程。 我想檢查一個這樣的過程是否完成。我發現了兩種檢查子進程狀態的方法,但都似乎迫使進程完成。 一個使用process.communicate()並打印返回碼,如解釋here。 另一種方法是簡單地調用process.wait()並檢查它是否返回0.有沒有辦法檢查子進程是否仍在運行?

有沒有一種方法可以檢查進程是否仍在運行,而無需等待進程完成?

+0

['Popen.poll()'](https://docs.python.org/2/library/subprocess.html#subprocess.Popen.poll)? – asongtoruin

+0

@ason​​gtoruin打印無,即使過程完成。 – ahura

+0

過程完成後應停止打印'無'。你如何調用你的子進程? – asongtoruin

回答

8

Ouestion: ... a way to check if a process is still running ...

例如你可以做到這一點:

p = subprocess.Popen(... 
""" 
A None value indicates that the process hasn't terminated yet. 
""" 
poll = p.poll() 
if poll == None: 
    # p.subprocess is alive 

Python » 3.6.1 Documentation popen-objects

測試使用Python 3.4.2

+0

這給出了「AttributeError:'Popen'對象沒有屬性'進程'」 – ahura

+1

我可以做p.poll ()。即使完成該過程,它也會返回None。我知道這是因爲我調用的腳本產生了一個輸出文件,它仍然會返回None。 另外,我可以打印給出0的p.wait(),但打印後面的p.poll()仍然給出None。 – ahura

+2

語義,但我相信'如果輪詢是無'是寫它的首選方式。 – asongtoruin

0

您可以使用subprocess.check_output來查看您的輸出。

試試這個代碼:

import subprocess 
subprocess.check_output(['your command here'], shell=True, stderr=subprocess.STDOUT) 

希望這有助於!

0

做好

myProcessIsRunning = poll() is None 

正如主要答案中所建議的那樣,是推薦的方法和最簡單的方法來檢查一個進程是否正在運行。 (並且它也以jython的方式工作)

如果您沒有手動檢查它的流程實例。 然後使用操作系統TaskList/Ps進程。

在Windows上,我的命令如下所示:

filterByPid = "PID eq %s" % pid 
     pidStr = str(pid) 
     commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr", pidStr ] 

這實質上是在做同樣的事情,以下命令行:

cmd /c "tasklist /FI "PID eq 55588" | findstr 55588" 

在Linux上,我做同樣的使用:

pidStr = str(pid) 
commandArguments = ['ps', '-p', pidStr ] 

ps命令將已經返回了錯誤代碼0/1,具體取決於Ò n是否找到過程。在Windows上,您需要find字符串命令。

這是該followig堆棧溢出線程上討論相同的方法:

Verify if a process is running using its PID in JAVA

注: 如果使用這種方法,remeber來包裝你的命令調用在
嘗試: foundRunningProcess =子進程。check_output(argumentsArray,** kwargs) 返回true 除了異常的錯誤: 返回False

請注意,如果您正在使用VS代碼開發和使用純Python和Jython小心。 在我的環境中,我擔心poll()方法不起作用,因爲我懷疑這個過程肯定已經結束了,確實正在運行。 這個過程已經推出了Wild。。在我要求野蠅停止後,殼仍在等待用戶「按任意鍵繼續......」。

爲了玩完這個過程中,在純Python下面的代碼是工作:

process.stdin.write(os.linesep) 

在Jython中,我必須解決這個問題的代碼如下所示:

print >>process.stdin, os.linesep 

而且有了這種差異,這個過程確實完成了。 jython.poll()開始告訴我這個過程確實完成了。

相關問題