boru

2012-05-01 26 views
5

Yani belirli bir makinede ilk 3 CPU "yoğun" süreçleri için sorgulamak çalışıyorum ve bunu yapmak için bu kabuk komutu bulundu: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3boru

kullanmak istediğim Bu veri bir Python betiği içinde, bu yüzden yukarıdaki komutun çıktısını subprocess modülü üzerinden yakalayabilmem gerekiyor. işleri takip, ama sadece ben ilk 3'e kadar kısıtlamadan değilim beri büyük bir dize döndürür: Pek emin değilim

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

nasıl bu subprocess.check_output çalışır .. Denedim yetersiz bir girişim: bana bir hata verir

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

: ps: illegal argument: |

nasıl Python içindeki boru | sembolü kullanmak veya başka kullanırım psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args']) tarafından döndürülen dev dizede inanılmaz miktarlarda ayrıştırma yapmak zorunda kalmadan sıralama yapmak için?

Teşekkürler! Selamlar, -kstruct

+0

Sen borularla kodunuzu içeren bir kabuk yazabilirim sonra altişlem modülünden böyle hitap – jedwards

cevap

10

Sen düz kabuk komutunu çalıştırmak için shell=True argüman iletebilirsiniz: ps sıralama seçeneklerini kullanın Alternatif

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

ve Python yerleşik dize fonksiyonları böyle:

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

Eğer kullanmak işe olmalıdır: borular çalışacak böylece

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

sonra komut, tam /bin/sh kullanarak böyle çalıştırılır.

1

Neden Harici komutları kullanmak? psutil kullanın:

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

Bazıları shell=True kullanarak sürmüştür ve kabuk girdi güvenilen geçiyoruz this answer gayet iyi. Ancak, shell=True bazı güvensizlikler getiriyor. Güvenlik için, docs şunları öneririz:

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]