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?
Réponses
Trop de publicités?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.
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.
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]