2012-05-01 17 views
5

तो मैं एक दिया मशीन पर शीर्ष 3 सीपीयू "गहन" प्रक्रियाओं के लिए क्वेरी करने के लिए कोशिश कर रहा हूँ, और मैं यह करने के लिए इस शेल कमांड पाया: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3पाइपिंग

मैं उपयोग करना चाहते हैं यह डेटा एक पायथन लिपि के अंदर है, इसलिए मुझे उपरोक्त कमांड के आउटपुट को subprocess मॉड्यूल के माध्यम से कैप्चर करने में सक्षम होना चाहिए। निम्नलिखित काम करता है, लेकिन सिर्फ एक विशाल स्ट्रिंग के बाद से मैं इसे शीर्ष 3 करने के लिए सीमित नहीं कर रहा हूँ रिटर्न:

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

मैं काफी यकीन नहीं है कि यह कैसे काम करता है subprocess.check_output .. एक अल्प प्रयास मैंने कोशिश में:

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

कौन सा मुझे एक त्रुटि देता है: ps: illegal argument: |

मैं कैसे पायथन के अंदर पाइप | प्रतीक का उपयोग करते हैं, या किसी अन्य का उपयोग psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args']) द्वारा लौटाई गई विशाल स्ट्रिंग पर पार्सिंग की अविश्वसनीय मात्रा के बिना सॉर्टिंग करने का तरीका?

धन्यवाद! सादर, -kstruct

+0

आप पाइप के साथ अपने कोड के साथ एक खोल स्क्रिप्ट लिख सकता है, तो उस उपप्रक्रिया मॉड्यूल से फोन – jedwards

उत्तर

10

आप सादे शेल कमांड निष्पादित करने के लिए shell=True तर्क पारित कर सकते हैं: पायथन के

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

वैकल्पिक रूप से, ps की सॉर्टिंग विकल्प का उपयोग करें और बिल्ट-इन स्ट्रिंग कार्यों इस तरह:

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

अगर आप का उपयोग यह काम करना चाहिए:

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

तो आदेश, वास्तव में इस /bin/sh का उपयोग कर की तरह चलाया जाता है तो पाइप काम करेंगे।

1

क्यों बाहरी आदेशों का बिल्कुल उपयोग करें? 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

कुछ दूसरों की shell=True का उपयोग कर सुझाव दिया है, और यदि आप खोल करने के लिए इनपुट पर भरोसा गुजर रहे हैं this answer ठीक है। हालांकि, shell=True कुछ असुरक्षा पेश करता है। सुरक्षा के लिए, docs की सलाह देते हैं निम्नलिखित:

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] 
संबंधित मुद्दे