Я хочу использовать subprocess.check_output()
с ps -A | grep 'process_name'
.
Я пробовал разные решения, но пока ничего не получалось. Кто-нибудь может подсказать мне, как это сделать?
Как использовать команду 'subprocess' с каналами
Ответ 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
Или вы всегда можете использовать метод связи для объектов подпроцесса.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
Метод связи возвращает кортеж стандартного вывода и стандартную ошибку.
Ответ 3
См. документацию по настройке конвейера с использованием подпроцесса: 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]
Ответ 4
Решение JKALAVIS хорошо, однако я бы добавил улучшение для использования shlex вместо SHELL = TRUE. ниже я вычеркиваю количество запросов
#!/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)
Ответ 5
Вы можете попробовать функциональность канала в sh.py:
import sh
print sh.grep(sh.ps("-ax"), "process_name")
Ответ 6
Кроме того, попробуйте использовать команду 'pgrep'
вместо 'ps -A | grep 'process_name'
Ответ 7
Вы можете попробовать
check_output(["sh", "-c", "ps", "-A", "|", "grep", "process_name"])
ИЛИ
check_output(["bash", "-c", "ps", "-A", "|", "grep", "process_name"])