2010-08-07 12 views
16

如何使用Python來確定當前正在運行的程序。我在Windows上。在Python中確定正在運行的程序

+3

嘿!歡迎來到StackOverflow!如果您發佈了您嘗試過的但尚未爲您工作的內容,這將非常有幫助。這可以讓回答問題的人知道你遇到了什麼問題。祝你好運! – 2010-08-07 05:37:22

回答

11
import os 
os.system('WMIC /OUTPUT:C:\ProcessList.txt PROCESS get Caption,Commandline,Processid') 
f = open("C:\ProcessList.txt") 
plist = f.readlines() 
f.close() 

現在的plist包含的處理的格式化的空格隔開的列表:

  • 第一列是在運行
  • 第二列中的可執行文件的名稱是一個表示運行命令過程
  • 第三列是進程ID

這應該是簡單至p與蟒蛇屁股。請注意,第一行數據是列的標籤,而不是實際的過程。

請注意,此方法只適用於Windows!

+1

謝謝,WMIC運作良好。 不幸的是,輸出文本文件不容易解析。它是用UTF-16編碼的,所以我必須解碼並重新編碼爲ASCII碼才能使用if(procList中的processName)輕鬆解析:返回true – Murkantilism 2013-04-02 18:17:58

24

感謝@ hb2pencil的WMIC命令!下面是你可以不用管文件中的輸出:從子流程

import subprocess 
cmd = 'WMIC PROCESS get Caption,Commandline,Processid' 
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
for line in proc.stdout: 
    print line 
6

管道命令的信息是不理想相比,實際的Python的工具意味着越來越過程。嘗試psutil模塊。爲了獲取進程號的列表,這樣做:

psutil.get_pid_list() 

恐怕你必須在網上下載這個模塊,它不包含在Python發行,但是這是解決你的問題的較好方法。要獲得你有一個號碼的過程的名稱,請執行:

psutil.Process(<number>).name 

這應該是你在找什麼。此外,這裏是一個辦法找到,如果一個特定的進程正在運行:

def process_exists(name): 
    i = psutil.get_pid_list() 
    for a in i: 
     try: 
      if str(psutil.Process(a).name) == name: 
       return True 
     except: 
      pass 
    return False 

它使用的可執行文件的名稱,因此,例如,找一個PowerShell窗口中,你可以這樣做:

process_exists("powershell.exe") 
+0

get_pid_list()已棄用,請使用pids()而不是 – jake77 2015-10-16 19:58:49

+0

我做了一些測試,對我來說在win10上,psutil需要大約10倍的時間來完成與管道WMIC相同的任務 – user2145184 2018-03-08 18:42:27

3

我得到的訪問被get_pid_list()拒絕。一個新的方法爲我在Windows和OSX上工作:

import psutil 

for proc in psutil.process_iter(): 
    try: 
     if proc.name() == u"chrome.exe": 
      print(proc) 
      print proc.cmdline() 
    except psutil.AccessDenied: 
     print "Permission error or access denied on process"