Commande de sous-processus Python avec pipe

Je veux utiliser subprocess.check_output() avec ps -A | grep 'process_name'. J'ai essayé diverses solutions mais jusqu'à présent rien n'a fonctionné. Quelqu'un peut-il me guider comment faire?

147
demandé sur zuberuber 2012-11-11 18:55:16

7 réponses

Pour utiliser un tuyau avec le module subprocess, vous devez passer shell=True.

Cependant, ce n'est pas vraiment conseillé pour diverses raisons, dont la sécurité. Au lieu de cela, créez les processus ps et grep séparément, et acheminez 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.

299
répondu Taymon 2012-11-11 14:58:02

Ou vous pouvez toujours utiliser la méthode communicate sur les objets subprocess.

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 Communicate renvoie dans un tuple la sortie standard et l'erreur standard.

38
répondu jkalivas 2012-11-11 16:35:06

Voir la documentation sur la configuration d'un pipeline à l'aide du 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 être à 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]
18
répondu AlcubierreDrive 2013-06-16 01:12:21

Essayez également d'utiliser la commande 'pgrep' au lieu de 'ps -A | grep 'process_name'

3
répondu Shooe 2012-11-13 10:34:47

La solution JKALAVIS est bonne, mais j'ajouterais une amélioration pour utiliser shlex au lieu de SHELL = TRUE. ci-dessous im grepping sur les temps de requête

#!/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

Santé,

3
répondu Daniel Smith 2018-04-28 01:09:36

, Vous pouvez essayer la pipe fonctionnalité dans sh.py:

import sh
print sh.grep(sh.ps("-ax"), "process_name")
2
répondu amoffat 2012-11-12 05:54:58

Vous pouvez essayer

check_output(["sh", "-c", "ps", "-A", "|", "grep", "process_name"])

Ou

check_output(["bash", "-c", "ps", "-A", "|", "grep", "process_name"])
-3
répondu GangNanTed 2016-11-15 21:51:30