Saya ingin menggunakan subprocess.check_output()
dengan ps -A | grep 'process_name'
. Saya mencoba berbagai solusi tetapi sejauh ini tidak ada yang berhasil. Bisakah seseorang membimbing saya bagaimana melakukannya?
python
linux
subprocess
pipe
zuberuber
sumber
sumber
psutil
yang memungkinkan untuk mendapatkan info proses secara portabel.Jawaban:
Untuk menggunakan pipa dengan
subprocess
modul, Anda harus lulusshell=True
.Namun, ini tidak benar-benar disarankan karena berbagai alasan, paling tidak keamanannya. Alih-alih, buat
ps
dangrep
proses secara terpisah, dan pipa keluaran dari satu ke yang lain, seperti:Namun, dalam kasus khusus Anda, solusi sederhana adalah menelepon
subprocess.check_output(('ps', '-A'))
dan kemudianstr.find
pada output.sumber
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
hanya berarti bahwa tidak ada yang ditemukan oleh grep, jadi itu perilaku normal.ps.wait()
ketika kita sudah memiliki output.ps.wait.__doc__
menunggu anak untuk berakhir tetapi konten anak tampaknya sudah dimasukkan ke dalamoutput
variabelstring.find
, yang telah usang dalam mendukungstr.find
(yaitu, metodefind
padastr
objek).grep
mati sebelum waktunya;ps
dapat menggantung tanpa batas waktu jika menghasilkan output yang cukup untuk mengisi buffer pipa OS-nya (karena Anda belum memanggilps.stdout.close()
induknya). Tukar urutan awal, untuk menghindarinyaAtau Anda selalu dapat menggunakan metode komunikasi pada objek subproses.
Metode berkomunikasi mengembalikan tupel dari output standar dan kesalahan standar.
sumber
communicate
lebih baik daripadawait
. Ada peringatan seperti itu: "Ini akan menemui jalan buntu ketika menggunakan stdout = PIPE dan / atau stderr = PIPE dan proses anak menghasilkan output yang cukup untuk pipa sehingga memblokir menunggu buffer pipa OS untuk menerima lebih banyak data. Gunakan berkomunikasi () untuk hindari itu. "Lihat dokumentasi tentang menyiapkan saluran pipa menggunakan subproses: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Saya belum menguji contoh kode berikut tetapi seharusnya kira-kira seperti yang Anda inginkan:
sumber
Solusi JKALAVIS baik, namun saya akan menambahkan peningkatan untuk menggunakan shlex bukan SHELL = TRUE. di bawah ini saya mencantumkan waktu kueri
sumber
Juga, coba gunakan
'pgrep'
perintah, bukan'ps -A | grep 'process_name'
sumber
Anda dapat mencoba fungsi pipa di sh.py :
sumber
Setelah Python 3.5 Anda juga dapat menggunakan:
Eksekusi dari perintah ini sedang diblokir dan output akan berada di process.stdout .
sumber