2010-07-09 97 views
4

我認爲這是一個非常基本的問題,但無論如何,這是它。在Python中監控進程?

我需要編寫一個python腳本來檢查以確保某個進程(如notepad.exe)正在運行。如果該進程正在運行,則什麼也不做。如果不是,請啓動它。這將如何完成。

我使用Python 2.6在Windows XP

+0

我不認爲有必要提到「黑色」...... – nevets1219 2010-07-09 17:56:41

+0

好的,修正了這個問題。你有問題的解決方案? – 2010-07-09 17:57:21

回答

4

有幾個選項,

1:越粗糙,但明顯的是做一些文字處理反對:

os.popen('tasklist').read() 

2:更多的參與選項是使用pywin32並研究win32 API來確定哪些進程正在運行。

3:WMI(I found this剛纔)和here is a vbscript如何通過WMI爲機器查詢進程的示例。

+0

只是爲了提供一點澄清,第一個選項變得非常簡單,正則表達式搜索 >>> bool(re.search('notepad.exe',os.popen('tasklist')。read())) – andyortlieb 2010-07-09 18:12:08

+1

你甚至不需要正則表達式。一個簡單的'如果在字符串中的子字符串︰'類型的語句工作得很好。 (或者說,'不在',因爲它應該在進程不活動時執行) – JAB 2010-07-09 18:16:03

+0

這正是我需要的! Thansk太多了! – 2010-07-09 18:25:03

15

os模塊的進程創建功能顯然不贊成在Python 2.6及更高版本,與模塊是選擇的模塊了,所以......

if 'notepad.exe' not in subprocess.Popen('tasklist', stdout=subprocess.PIPE).communicate()[0]: 
    subprocess.Popen('notepad.exe') 

注意的是Python 3,字符串被檢查將需要一個字節的對象,所以它會是

if b'notepad.exe' not in [blah]: 
    subprocess.Popen('notepad.exe') 

(文件/進程的啓動並不需要是一個字節對象的名稱。)

+0

+1,這是一個重要的觀點。爲了簡短的演示,我使用了os.process(),但需要注意的是子進程功能更強大(當然也不推薦使用)。 – andyortlieb 2010-07-09 18:56:29