Вопрос-Ответ

How to use `subprocess` command with pipes

Как использовать команду `subprocess` с каналами

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

Переведено автоматически
Ответ 1

Чтобы использовать канал с 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 на выходе.

Ответ 2

Или вы всегда можете использовать метод 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 возвращает кортеж стандартных выходных данных и стандартную ошибку.

Ответ 3

Используя input from subprocess.run вы можете передать вывод одной команды во вторую.

import subprocess

ps = subprocess.run(['ps', '-A'], check=True, capture_output=True)
processNames = subprocess.run(['grep', 'process_name'],
input=ps.stdout, capture_output=True)
print(processNames.stdout.decode('utf-8').strip())
Ответ 4

Смотрите документацию по настройке конвейера с использованием subprocess: 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]
python linux subprocess