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?
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?
Jawaban:
Untuk menggunakan pipa dengan subprocessmodul, Anda harus lulus shell=True.
Namun, ini tidak benar-benar disarankan karena berbagai alasan, paling tidak keamanannya. Alih-alih, buat psdan grepproses secara terpisah, dan pipa keluaran dari satu ke yang lain, seperti:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
Namun, dalam kasus khusus Anda, solusi sederhana adalah menelepon subprocess.check_output(('ps', '-A'))dan kemudian str.findpada output.
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1hanya 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 dalam outputvariabel
string.find, yang telah usang dalam mendukung str.find(yaitu, metode findpada strobjek).
grepmati sebelum waktunya; psdapat menggantung tanpa batas waktu jika menghasilkan output yang cukup untuk mengisi buffer pipa OS-nya (karena Anda belum memanggil ps.stdout.close()induknya). Tukar urutan awal, untuk menghindarinya
Atau Anda selalu dapat menggunakan metode komunikasi pada objek subproses.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
Metode berkomunikasi mengembalikan tupel dari output standar dan kesalahan standar.
communicatelebih baik daripada wait. 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:
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]
Solusi JKALAVIS baik, namun saya akan menambahkan peningkatan untuk menggunakan shlex bukan SHELL = TRUE. di bawah ini saya mencantumkan waktu kueri
#!/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)
Setelah Python 3.5 Anda juga dapat menggunakan:
import subprocess
f = open('test.txt', 'w')
process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
f.write(process.stdout)
f.close()
Eksekusi dari perintah ini sedang diblokir dan output akan berada di process.stdout .