Polecenie podprocesu Pythona z pipe

Chcę użyć subprocess.check_output() z ps -A | grep 'process_name'. Próbowałem różnych rozwiązań, ale do tej pory nic nie działało. Czy ktoś może mi pomóc Jak to zrobić?

Author: zuberuber, 2012-11-11

7 answers

Aby użyć rury z modułem subprocess, musisz przejść shell=True.

Jednak nie jest to tak naprawdę wskazane z różnych powodów, między innymi z bezpieczeństwa. Zamiast tego, utwórz procesy ps i grep oddzielnie i przełącz wyjście z jednego do drugiego, w ten sposób:

ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()

W twoim konkretnym przypadku, jednak prostym rozwiązaniem jest wywołanie subprocess.check_output(('ps', '-A')), a następnie str.find na wyjściu.

 299
Author: Taymon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-11 14:58:02

Lub zawsze możesz użyć metody communicate na obiektach podprocesowych.

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

Metoda Communicate zwraca w krotce standardowe wyjście i błąd standardowy.

 38
Author: jkalivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-11 16:35:06

Zobacz dokumentację dotyczącą konfigurowania potoku przy użyciu podprocesu: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

Nie testowałem poniższego przykładu kodu, ale powinien być mniej więcej taki, jaki chcesz:

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]
 18
Author: AlcubierreDrive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:12:21

Spróbuj również użyć polecenia 'pgrep' zamiast 'ps -A | grep 'process_name'

 3
Author: Shooe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-13 10:34:47

Jkalavis rozwiązanie jest dobre, jednak dodałbym poprawę, aby użyć shlex zamiast SHELL = TRUE. poniżej im grepping Out Query times

#!/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
Zdrówko, zdrówko]}
 3
Author: Daniel Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 01:09:36

Możesz wypróbować funkcjonalność rury w sh.py :

import sh
print sh.grep(sh.ps("-ax"), "process_name")
 2
Author: amoffat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-12 05:54:58

Możesz spróbować

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

Lub

check_output(["bash", "-c", "ps", "-A", "|", "grep", "process_name"])
 -3
Author: GangNanTed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 21:51:30