Команда подпроцесса Python с трубой


Я хочу использовать subprocess.check_output() с ps -A | grep 'process_name'. Я пробовал различные решения, но пока ничего не получалось. Может кто-нибудь подсказать мне, как это сделать?

7 147

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]

кроме того, попробуйте использовать вместо 'ps -A | grep 'process_name'

решение 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")

Вы можете попробовать

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

или

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