2012-05-01 31 views
5

Vì vậy, tôi đang cố gắng để truy vấn cho 3 CPU đầu quá trình "thâm" trên một máy nào đó, và tôi thấy lệnh này vỏ để làm điều đó: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3đường ống trong vỏ thông qua mô-đun Python subprocess

Tôi muốn sử dụng dữ liệu này bên trong một kịch bản Python, vì vậy tôi cần để có thể nắm bắt đầu ra của lệnh trên thông qua mô-đun subprocess. Các công trình sau đây, nhưng chỉ cần trả về một chuỗi rất lớn kể từ khi tôi không hạn chế nó vào top 3:

psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])

Tôi không hoàn toàn chắc chắn cách này subprocess.check_output công trình .. trong một nỗ lực ít ỏi tôi đã cố gắng:

subprocess.check_output(['ps', '-eo', 'pcpu,user,args', '|', 'sort', '-k', '1', '-r', '|', 'head', '-3'])

nào mang lại cho tôi một lỗi: ps: illegal argument: |

làm thế nào để sử dụng các đường ống | biểu tượng bên trong Python, hoặc sử dụng một số khác cách để làm việc phân loại mà không cần phải làm một số lượng đáng kinh ngạc của phân tích cú pháp trên chuỗi lớn trở lại bởi psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])?

Cảm ơn! Kính trọng, -kstruct

+0

Bạn có thể viết tập lệnh shell chứa mã của bạn với đường ống, sau đó gọi tập lệnh từ mô-đun phụ – jedwards

Trả lời

10

Bạn có thể vượt qua đối số shell=True để thực hiện lệnh shell đơn giản:

import subprocess 
subprocess.check_output('ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3', 
         shell=True) 

Ngoài ra, sử dụng tùy chọn sắp xếp của ps và Python tích hợp trong chức năng chuỗi như thế này:

raw = subprocess.check_output('ps -eo pcpu,pid,user,args --sort -pcpu') 
first_three_lines = list(raw.split('\n'))[:3] 
1

nó nên có tác dụng nếu bạn sử dụng:

subprocess.check_output("ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3", shell=True) 

sau đó lệnh được chạy chính xác như thế này sử dụng /bin/sh, vì vậy các đường ống sẽ làm việc.

1

Tại sao sử dụng các lệnh bên ngoài? Sử dụng psutil:

import psutil 
def cpu_percentage(proc): 
    try: 
     return proc.get_cpu_percent() 
    except psutil.AccessDenied: 
     return float('-inf') 

top3 = sorted(psutil.process_iter(), key=cpu_percentage, reverse=True)[:3] 
for proc in top3: 
    # do whatever 
4

Một số người khác đã đề nghị sử dụng shell=True, và this answer là tốt nếu bạn đang đi qua đáng tin cậy đầu vào vỏ. Tuy nhiên, shell=True giới thiệu một số bất an. Để bảo mật, docs đề nghị những điều sau đây:

output=`dmesg | grep hda` 
# becomes 
p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 
Các vấn đề liên quan