Chcę używać subprocess.check_output()
z ps -A | grep 'process_name'
. Próbowałem różnych rozwiązań, ale jak dotąd nic nie działało. Czy ktoś może mi pomóc, jak to zrobić?
python
linux
subprocess
pipe
zuberuber
źródło
źródło
psutil
możliwość uzyskania informacji o procesie w przenośny sposób.Odpowiedzi:
Aby użyć rury z
subprocess
modułem, musisz przejśćshell=True
.Nie jest to jednak zalecane z różnych powodów, między innymi z uwagi na bezpieczeństwo. Zamiast utworzyć
ps
igrep
procesami oddzielnie, wyjście z rury jedna w drugą, tak jak poniżej:Jednak w twoim konkretnym przypadku prostym rozwiązaniem jest wywołanie,
subprocess.check_output(('ps', '-A'))
a następniestr.find
wyjście.źródło
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
oznacza po prostu, że grep nic nie znalazł, więc jest to normalne zachowanie.ps.wait()
kiedy mamy już dane wyjściowe.ps.wait.__doc__
czeka na zakończenie przez dziecko, ale zawartość dziecka wydaje się już umieszczona woutput
zmiennejstring.find
, co zostało przestarzałe na korzyśćstr.find
(tj. Metodyfind
nastr
obiektach).grep
umrze przedwcześnie;ps
może zawiesić się na czas nieokreślony, jeśli wygeneruje wystarczającą moc wyjściową do wypełnienia bufora potoku systemu operacyjnego (ponieważ nie wywołanops.stdout.close()
elementu nadrzędnego). Zamień kolejność początkową, aby tego uniknąćLub zawsze możesz użyć metody komunikacji na obiektach podprocesu.
Metoda komunikacji zwraca krotkę standardowego wyjścia i standardowy błąd.
źródło
communicate
jest lepsze niżwait
. Występuje takie ostrzeżenie: „Spowoduje to zakleszczenie przy użyciu stdout = PIPE i / lub stderr = PIPE, a proces potomny generuje wystarczającą moc wyjściową do potoku, tak że blokuje on oczekiwanie na bufor potoku systemu operacyjnego, aby zaakceptować więcej danych. unikaj tego ”.Zobacz dokumentację dotyczącą konfigurowania potoku za pomocą podprocesu: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Nie testowałem następującego przykładu kodu, ale powinien on być mniej więcej taki, jak chcesz:
źródło
Rozwiązanie JKALAVIS jest dobre, ale dodałbym ulepszenie do używania shlex zamiast SHELL = TRUE. poniżej przedstawiam czasy zapytania
źródło
Spróbuj także użyć
'pgrep'
polecenia zamiast'ps -A | grep 'process_name'
źródło
Możesz wypróbować funkcjonalność potoku w sh.py :
źródło
Po Python 3.5 możesz także używać:
Wykonanie polecenia blokuje, a dane wyjściowe będą przetwarzane . Proces .
źródło