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)