393 votes

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 le faire?

627voto

Taymon Points 8103

Pour utiliser un canal de communication avec l' subprocess module, vous devez passer shell=True.

Cependant, ce n'est pas vraiment souhaitable, pour diverses raisons, notamment de sécurité. Au lieu de cela, créer l' ps et grep processus séparément, et le tuyau de la sortie de l'un en l'autre, comme suit:

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 la plus simple est d'appeler subprocess.check_output(('ps', '-A')) puis str.find sur la sortie.

87voto

jkalivas Points 77

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

32voto

AlcubierreDrive Points 2124

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 cela 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]
 

3voto

Shooe Points 21

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

3voto

amoffat Points 192

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

 import sh
print sh.grep(sh.ps("-ax"), "process_name")
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X