2011-11-15 37 views
12

Tôi đang cố gắng tìm ra một cách để phát hiện xem một tiến trình đang chạy trong Windows Task Manager cho Windows OS và Macintosh Activity Monitor cho MAC OS bằng cách sử dụng PythonLàm thế nào để phát hiện nếu một tiến trình đang chạy bằng Python trên Win và MAC

Có thể ai đó vui lòng giúp tôi với mã không?

+0

Dưới đây là cách thực hiện các quy trình đang chạy trên Windows: http://timgolden.me.uk/python/wmi/cookbook.html#list-all-running-processes - và đây là cách để có được thông tin quy trình đang chạy trên OSX: http://stackoverflow.com/questions/1673874/how-can-i-get-the-full-list-of-running-processes-on-a-mac-from-a-python-app – Acorn

Trả lời

19

psutil là thư viện đa nền tảng truy xuất thông tin về các quy trình đang chạy và sử dụng hệ thống.

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) 

Trong một cổ phiếu của Windows Python bạn có thể sử dụng subprocesscsv để phân tích đầu ra của 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

Có thể tôi làm điều này chỉ sử dụng Python (os/subprocess/bất kỳ module nào khác) và không sử dụng bất kỳ module bên ngoài –

+0

@ jake77, câu trả lời này không gọi 'get_pid_list', và không bao giờ gọi nó. Ban đầu tôi đã sử dụng 'get_process_list', nhưng nó không còn có sẵn trong các phiên bản psutil mới hơn, vì vậy năm ngoái tôi đã cập nhật câu trả lời để sử dụng' process_iter'. Điều này làm việc tốt trong psutil 3.2.2. – eryksun

3

Dưới đây là một spin off của giải pháp Windows eryksun của, thả nhập csv và lọc trực tiếp danh sách tác vụ cho tên 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 
Các vấn đề liên quan