Ich möchte verwenden subprocess.check_output()
mit ps -A | grep 'process_name'
. Ich habe verschiedene Lösungen ausprobiert, aber bisher hat nichts funktioniert. Kann mir jemand zeigen, wie es geht?
python
linux
subprocess
pipe
zuberuber
quelle
quelle
psutil
die Möglichkeit, Prozessinformationen auf tragbare Weise abzurufen.Antworten:
Um ein Rohr mit dem
subprocess
Modul zu verwenden, müssen Sie passierenshell=True
.Dies ist jedoch aus verschiedenen Gründen nicht wirklich ratsam, nicht zuletzt aus Sicherheitsgründen. Erstellen Sie stattdessen die
ps
undgrep
-Prozesse separat und leiten Sie die Ausgabe wie folgt von einer zur anderen weiter:In Ihrem speziellen Fall besteht die einfache Lösung jedoch darin, die Ausgabe aufzurufen
subprocess.check_output(('ps', '-A'))
und dannstr.find
zu aktivieren.quelle
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
bedeutet nur, dass grep nichts gefunden hat, also ist es normales Verhalten.ps.wait()
für, wenn wir bereits die Ausgabe haben.ps.wait.__doc__
wartet auf die Beendigung des Kindes, aber der Inhalt des Kindes scheint bereits in deroutput
Variablen platziert zu seinstring.find
, was zugunsten vonstr.find
(dh der Methodefind
fürstr
Objekte) veraltet ist .grep
vorzeitig stirbt;ps
kann auf unbestimmte Zeit hängen bleiben, wenn es genügend Ausgabe erzeugt, um seinen OS-Pipe-Puffer zu füllen (weil Sieps.stdout.close()
das übergeordnete Element nicht aufgerufen haben ). Tauschen Sie die Startreihenfolge aus, um dies zu vermeidenOder Sie können die Kommunikationsmethode immer für die Unterprozessobjekte verwenden.
Die Kommunikationsmethode gibt ein Tupel der Standardausgabe und des Standardfehlers zurück.
quelle
communicate
ist besser alswait
. Es gibt eine solche Warnung: "Dies führt zu einem Deadlock bei Verwendung von stdout = PIPE und / oder stderr = PIPE, und der untergeordnete Prozess generiert genügend Ausgabe für eine Pipe, sodass das Warten auf den OS-Pipe-Puffer blockiert wird, um weitere Daten zu akzeptieren. Verwenden Sie communic () to vermeide das. "Weitere Informationen zum Einrichten einer Pipeline mithilfe eines Unterprozesses 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 das sein, was Sie wollen:
quelle
Die JKALAVIS-Lösung ist gut, ich würde jedoch eine Verbesserung hinzufügen, um Shlex anstelle von SHELL = TRUE zu verwenden. unten grep ich die Abfragezeiten aus
quelle
Versuchen Sie auch, den
'pgrep'
Befehl anstelle von zu verwenden'ps -A | grep 'process_name'
quelle
Sie können die Pipe-Funktionalität in sh.py ausprobieren :
quelle
Nach Python 3.5 können Sie auch Folgendes verwenden:
Die Ausführung des Befehls blockiert und die Ausgabe erfolgt in process.stdout .
quelle