2011-11-15 74 views
12

我正试图找出一种方法来检测进程是否在运行Windows操作系统的Windows任务管理器和运行Macintosh操作系统的Macintosh活动监视器上使用Python如何在Win和MAC上使用Python检测进程是否正在运行

有人可以请帮我拿出代码吗?

+0

下面是如何获得在Windows上运行的进程:http://timgolden.me.uk/python/wmi/cookbook.html#list-all-running-processes - 这里是如何得到正在运行的进程信息在OSX上:http://stackoverflow.com/questions/1673874/how-can-i-get-the-full-list-of-running-processes-on-a-mac-from-a-python-app – Acorn

回答

19

psutil是一个跨平台的库,用于检索有关正在运行的进程和系统利用率的信息。

import psutil 

pythons_psutil = [] 
for p in psutil.process_iter(): 
    try: 
     if p.name() == 'python.exe': 
      pythons_psutil.append(p) 
    except psutil.Error: 
     pass 
>>> pythons_psutil 
[<psutil.Process(pid=16988, name='python.exe') at 25793424>] 

>>> print(*sorted(pythons_psutil[0].as_dict()), sep='\n') 
cmdline 
connections 
cpu_affinity 
cpu_percent 
cpu_times 
create_time 
cwd 
exe 
io_counters 
ionice 
memory_info 
memory_info_ex 
memory_maps 
memory_percent 
name 
nice 
num_ctx_switches 
num_handles 
num_threads 
open_files 
pid 
ppid 
status 
threads 
username 

>>> pythons_psutil[0].memory_info() 
pmem(rss=12304384, vms=8912896) 

在A股的Windows Python中,你可以使用subprocesscsv解析的tasklist.exe输出:

import subprocess 
import csv 

p_tasklist = subprocess.Popen('tasklist.exe /fo csv', 
           stdout=subprocess.PIPE, 
           universal_newlines=True) 

pythons_tasklist = [] 
for p in csv.DictReader(p_tasklist.stdout): 
    if p['Image Name'] == 'python.exe': 
     pythons_tasklist.append(p) 
>>> print(*sorted(pythons_tasklist[0]), sep='\n') 
Image Name 
Mem Usage 
PID 
Session Name 
Session# 

>>> pythons_tasklist[0]['Mem Usage'] 
'11,876 K' 
+2

Can我这样做只使用Python(os/subprocess /任何其他模块),而不使用任何外部模块 –

+0

@ jake77,这个答案不会调用'get_pid_list',并且永远不会调用它。最初我使用了'get_process_list',但是在更新版本的psutil中不再可用,所以去年我更新了使用'process_iter'的答案。这适用于psutil 3.2.2。 – eryksun

3

这里是关eryksun的Windows解决方案的自旋,删除csv导入并直接过滤任务列表输出的exe名称:

def isWindowsProcessRunning(exeName) :    
    import subprocess  
    process = subprocess.Popen( 
     'tasklist.exe /FO CSV /FI "IMAGENAME eq %s"' % exeName, 
     stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
     universal_newlines=True) 
    out, err = process.communicate()  
    try : return out.split("\n")[1].startswith('"%s"' % exeName) 
    except : return False 
相关问题