Я хочу использовать subprocess.check_output()
с ps -A | grep 'process_name'
. Я пробовал разные решения, но пока ничего не получалось. Кто-нибудь может подсказать мне, как это сделать?
python
linux
subprocess
pipe
zuberuber
источник
источник
psutil
то, что позволяет получать информацию о процессе в портативном виде.Ответы:
Чтобы использовать трубу с
subprocess
модулем, нужно пройтиshell=True
.Однако это не рекомендуется по разным причинам, не в последнюю очередь из-за безопасности. Вместо этого, создать
ps
иgrep
процессы по отдельности, а труба на выходе одного из в другой, например , так:В вашем конкретном случае, однако, простое решение состоит в том, чтобы позвонить,
subprocess.check_output(('ps', '-A'))
а затемstr.find
на выходе.источник
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
просто означает, что grep ничего не нашел, так что это нормальное поведение.ps.wait()
когда у нас уже есть выход.ps.wait.__doc__
ждет, когда ребенок завершит свою работу, но содержание ребенка, кажется, уже помещено вoutput
переменнуюstring.find
, который устарел в пользуstr.find
(то есть, методfind
наstr
объектах).grep
умирает преждевременно;ps
может зависать на неопределенный срок, если он выдает достаточно данных, чтобы заполнить свой буфер канала ОС (потому что вы не вызвалиps.stdout.close()
родительский буфер ). Поменяйте местами стартовый порядок, чтобы избежать этогоИли вы всегда можете использовать метод связи для объектов подпроцесса.
Метод связи возвращает кортеж стандартного вывода и стандартную ошибку.
источник
communicate
лучше, чемwait
. Существует такое предупреждение: «Это приведет к взаимоблокировке при использовании stdout = PIPE и / или stderr = PIPE, и дочерний процесс генерирует достаточно данных для канала, так что он блокирует ожидание буфера канала ОС для приема большего количества данных. Используйте Communication () для избегай этого.См. Документацию по настройке конвейера с использованием подпроцесса: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline.
Я не тестировал следующий пример кода, но он должен быть примерно таким, как вы хотите:
источник
Решение JKALAVIS хорошо, однако я бы добавил улучшение для использования shlex вместо SHELL = TRUE. ниже я вытащил время запроса
источник
Кроме того, попробуйте использовать
'pgrep'
команду вместо'ps -A | grep 'process_name'
источник
Вы можете попробовать функциональность канала в sh.py :
источник
После Python 3.5 вы также можете использовать:
Выполнение команды блокируется, и вывод будет в process.stdout .
источник