Команда подпроцесса Python с трубой
Я хочу использовать subprocess.check_output()
с ps -A | grep 'process_name'
. Я пробовал различные решения, но пока ничего не получалось. Может кто-нибудь подсказать мне, как это сделать?
7 ответов:
чтобы использовать трубу с
subprocess
модуль, вы должны пройтиshell=True
.однако, это действительно не рекомендуется по различным причинам, не в последнюю очередь из которых является безопасность. Вместо этого создайте
ps
иgrep
обрабатывает отдельно, и труба выход от одного в другое, как так:ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE) output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout) ps.wait()
в вашем конкретном случае, однако, самым простым решением является вызов
subprocess.check_output(('ps', '-A'))
а тоstr.find
на выходе.
или вы всегда можете использовать метод communicate для объектов подпроцесса.
cmd = "ps -A|grep 'process_name'" ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) output = ps.communicate()[0] print output
метод communicate возвращает в кортеже стандартный вывод и стандартную ошибку.
см. документацию по настройке конвейера с помощью подпроцесса: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Я не проверял следующий пример кода, но это должно быть примерно то, что вы хотите:
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]
решение JKALAVIS хорошо, однако я бы добавил улучшение для использования shlex вместо SHELL=TRUE. ниже им применение grep К из запроса времени
#!/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
спасибо,
вы можете попробовать функциональность трубы в sh.py:
import sh print sh.grep(sh.ps("-ax"), "process_name")