Weitere Informationen finden Sie in der Dokumentation zum Einrichten einer Pipeline mithilfe von Unterprozessen: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:
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]
Oder Sie können immer die Methode communication für die Subprozessobjekte 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 communication gibt ein Tupel aus der Standardausgabe und dem Standardfehler zurück.
Um eine Pipe mit dem subprocess
zu verwenden Modul müssen Sie shell=True
bestehen .
Dies ist jedoch aus verschiedenen Gründen, nicht zuletzt aus Sicherheitsgründen, nicht wirklich ratsam. Erstellen Sie stattdessen ps
und grep
getrennt verarbeiten und die Ausgabe von einem in den anderen leiten, etwa so:
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'))
aufzurufen und dann str.find
am Ausgang.
Verwendung von subprocess.run
import subprocess
ps = subprocess.run(['ps', '-A'], check=True, capture_output=True)
processNames = subprocess.run(['grep', 'process_name'],
input=ps.stdout, capture_output=True)
print(processNames.stdout)