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?
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.
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.
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]
Essayez également d'utiliser la commande 'pgrep'
au lieu de 'ps -A | grep 'process_name'
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é,
Vous pouvez essayer
check_output(["sh", "-c", "ps", "-A", "|", "grep", "process_name"])
Ou
check_output(["bash", "-c", "ps", "-A", "|", "grep", "process_name"])