Consultez la documentation sur la configuration d'un pipeline à l'aide d'un sous-processus :http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Je n'ai pas testé l'exemple de code suivant, mais il devrait correspondre à peu près à ce que vous voulez :
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]
Ou vous pouvez toujours utiliser la méthode de communication sur les objets de sous-processus.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
La méthode de communication renvoie un tuple de la sortie standard et de l'erreur standard.
Pour utiliser un tuyau avec le subprocess module, vous devez réussir shell=True .
Cependant, ce n'est pas vraiment conseillé pour diverses raisons, dont la sécurité n'est pas la moindre. Au lieu de cela, créez le ps et grep traite séparément et dirige la sortie de l'un vers l'autre, comme ceci :
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
Dans votre cas particulier, cependant, la solution simple consiste à appeler subprocess.check_output(('ps', '-A')) puis str.find sur la sortie.
Utilisation de 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)