webentwicklung-frage-antwort-db.com.de

Wie man den Befehl `subprocess` mit Pipes benutzt

Ich möchte subprocess.check_output() mit ps -A | grep 'process_name' Verwenden. Ich habe verschiedene Lösungen ausprobiert, aber bisher hat nichts funktioniert. Kann mich jemand anleiten, wie es geht?

198
zuberuber

Um eine Pipe mit dem Modul subprocess zu verwenden, müssen Sie Shell=True Übergeben.

Dies ist jedoch aus verschiedenen Gründen nicht wirklich ratsam, nicht zuletzt aus Sicherheitsgründen. Erstellen Sie stattdessen die Prozesse ps und grep separat und leiten Sie die Ausgabe wie folgt in die andere um:

ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()

In Ihrem speziellen Fall besteht die einfache Lösung jedoch darin, subprocess.check_output(('ps', '-A')) und dann str.find Für die Ausgabe aufzurufen.

372
Taymon

Oder Sie können die Methode "communic" immer für die Unterprozessobjekte verwenden.

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,Shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

Die Methode communic gibt einen Tupel der Standardausgabe und den Standardfehler zurück.

51
jkalivas

Weitere Informationen zum Einrichten einer Pipeline mit dem Unterprozess finden Sie in der Dokumentation: http://docs.python.org/2/library/subprocess.html#replacing-Shell-pipeline

Ich habe das folgende Codebeispiel nicht getestet, aber es sollte ungefähr so ​​sein, wie Sie es möchten:

query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close()  # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]
20
AlcubierreDrive

Versuchen Sie auch, den Befehl 'pgrep' Anstelle von 'ps -A | grep 'process_name' Zu verwenden.

3
Shooe

Die JKALAVIS-Lösung ist gut, ich würde jedoch eine Verbesserung hinzufügen, um shlex anstelle von Shell = TRUE zu verwenden. unten grepping im out mal abfragen

#!/bin/python
import subprocess
import shlex

cmd = "Dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,Shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

Prost,

3
Daniel Smith

Sie können die Pipe-Funktionalität in sh.py ausprobieren:

import sh
print sh.grep(sh.ps("-ax"), "process_name")
3
amoffat