Rohrleitungen in der Schale, per Python-subprocess-Modul
Ich versuche also, die Abfrage der top-3-CPU - "intensiv" - Prozesse auf einer gegebenen Maschine, und ich fand diese shell-Befehl, es zu tun: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3
Möchte ich diese Daten in einem Python-Skript, so brauche ich, um in der Lage zu erfassen Sie die Ausgabe des obigen Befehls über die subprocess
Modul. Die folgenden Werke, sondern nur gibt einen riesigen string, da ich keine Beschränkung auf die top 3:
psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])
Ich bin mir nicht ganz sicher, wie das subprocess.check_output
funktioniert.. in einem mageren Versuch habe ich versucht:
subprocess.check_output(['ps', '-eo', 'pcpu,user,args', '|', 'sort', '-k', '1', '-r', '|', 'head', '-3'])
Gibt mir eine Fehlermeldung: ps: illegal argument: |
Wie benutze ich das Rohr |
symbol in Python oder eine andere Art und Weise zu tun, die Sortierung, die zimmerreserviereung, ohne das Sie unglaubliche Mengen an Analyse auf den riesigen string zurückgegeben psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])
?
Dank!
Grüße,
-kstruct
- Sie schreiben, könnte ein shell-Skript, das den code mit Pfeifen, rufen Sie dann, dass aus dem subprocess-Modul
Du musst angemeldet sein, um einen Kommentar abzugeben.
Übergeben Sie den
shell=True
argument führen Sie die einfachen shell-Befehl:Alternativ verwenden Sie die Sortier-Optionen von ps und Python ' s built-in string-Funktionen wie diese:
Einige andere haben vorgeschlagen, die Verwendung
shell=True
, und diese Antwort ist in Ordnung, wenn Sie auf der Durchreise sind Vertrauenswürdige Eingabe auf der shell. Allerdingsshell=True
führt einige Unsicherheiten. Für die Sicherheit, die docs Folgendes empfehlen:sollte es funktionieren wenn Sie:
dann der Befehl ausgeführt wird, genau wie dies mit
/bin/sh
, damit die Rohre arbeiten.Warum benutzen externe Befehle überhaupt? Verwenden psutil: