Saya mencoba membuat panggilan sistem dengan Python dan menyimpan output ke string yang dapat saya manipulasi dalam program Python.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Saya sudah mencoba beberapa hal termasuk beberapa saran di sini:
Mengambil output dari subprocess.call ()
tetapi tanpa keberuntungan.
python
subprocess
Menandai
sumber
sumber
"ntpq -p"
, yang merupakan bagian yang berbeda dari masalahnya daripada yang Anda tanyakan.Jawaban:
Dalam Python 2.7 atau Python 3
Alih-alih membuat
Popen
objek secara langsung, Anda dapat menggunakansubprocess.check_output()
fungsi untuk menyimpan output dari sebuah perintah dalam sebuah string:Dalam Python 2.4-2.6
Gunakan
communicate
metodenya.out
adalah apa yang kamu inginkan.Catatan penting tentang jawaban lain
Perhatikan bagaimana saya menyampaikan perintah. The
"ntpq -p"
contoh memunculkan masalah lain. KarenaPopen
tidak mengaktifkan shell, Anda akan menggunakan daftar perintah dan opsi—["ntpq", "-p"]
.sumber
Popen.communicate
tidak kembali sampai proses berakhir.p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
mengembalikanbytes
objek, bukan astr
. Jika semua yang ingin Anda lakukan adalah mencetak hasilnya, itu tidak akan membuat perbedaan. Tetapi jika Anda ingin menggunakan metode sepertimyString.split("\n")
pada hasilnya, Anda harus terlebih dahulu mendekodebytes
objek:subprocess.check_output(myParams).decode("utf-8")
misalnya.universal_newlines=True
sebagai parameter membantu saya dalam Python 3 untuk mendapatkan objek string. Jika universal_newlines Benar, mereka dibuka dalam mode teks dengan penyandian standar. Jika tidak, mereka dibuka sebagai aliran biner.Ini berfungsi untuk saya untuk mengarahkan ulang stdout (stderr dapat ditangani dengan cara yang sama):
Jika tidak berhasil untuk Anda, sebutkan persis masalah yang Anda alami.
sumber
\n
.pipe.returncode == 0
setelah baris terakhir juga.Popen
mengembalikan tuple daristdout
danstderr
, jadi ketika Anda mengakses[0]
Anda hanya meraihstdout
. Anda juga bisa melakukannyatext, err = pipe.communicate()
dantext
mendapatkan apa yang Anda harapkanDengan asumsi itu
pwd
hanya sebuah contoh, ini adalah bagaimana Anda dapat melakukannya:Lihat dokumentasi subproses untuk contoh lain dan informasi lebih lanjut.
sumber
subprocess.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
Dalam konstruktor Popen, jika shell adalah Benar , Anda harus lulus perintah sebagai string bukan sebagai urutan. Jika tidak, cukup bagi perintah ke dalam daftar:
Jika Anda perlu membaca juga kesalahan standar, ke inisialisasi Popen, Anda dapat mengatur stderr ke subproses.PIPE atau ke subprocess.STDOUT :
sumber
untuk Python 2.7+, jawaban idiomatis adalah menggunakan
subprocess.check_output()
Anda juga harus mencatat penanganan argumen saat menjalankan subproses, karena dapat sedikit membingungkan ....
Jika args hanya perintah tunggal tanpa args sendiri (atau Anda telah
shell=True
mengatur), itu bisa berupa string. Kalau tidak, itu harus daftar.misalnya ... untuk menjalankan
ls
perintah, ini tidak masalah:begitu juga ini:
namun, jika Anda ingin meneruskan beberapa argumen ke perintah shell, Anda tidak bisa melakukan ini:
alih-alih, Anda harus meneruskannya sebagai daftar:
yang
shlex.split()
fungsi kadang-kadang dapat berguna untuk membagi string menjadi shell-seperti sintaks sebelum membuat subproses ... seperti ini:sumber
Ini bekerja dengan baik untuk saya:
sumber
Ini sempurna bagi saya. Anda akan mendapatkan kode pengembalian, stdout dan stderr dalam sebuah tuple.
Sebagai contoh:
sumber
Jawaban yang diterima masih bagus, hanya beberapa komentar tentang fitur yang lebih baru. Karena python 3.6, Anda dapat menangani pengodean langsung di
check_output
, lihat dokumentasi . Ini mengembalikan objek string sekarang:Dalam python 3.7, parameter
capture_output
ditambahkan ke subprocess.run (), yang melakukan beberapa penanganan Popen / PIPE untuk kami, lihat dokumen python :sumber
Dalam hal ini Anda hanya akan memiliki satu elemen dalam daftar.
sumber
os.popen
sudah usang karenasubprocess
modul.Saya menulis sedikit fungsi berdasarkan jawaban lain di sini:
Pemakaian:
sumber
Dalam Python 3.7 argumen kata kunci baru
capture_output
diperkenalkan untuksubprocess.run
. Mengaktifkan pendek dan sederhana:sumber
Ini adalah solusi satu baris
sumber
Berikut ini menangkap stdout dan stderr proses dalam satu variabel. Ini kompatibel dengan Python 2 dan 3:
Jika perintah Anda adalah string daripada array, awali ini dengan:
sumber
Untuk python 3.5 saya memasang fungsi berdasarkan jawaban sebelumnya. Log dapat dihapus, pikir itu bagus untuk dimiliki
sumber
Gunakan
ckeck_output
metodesubprocess
Akhirnya parsing string
Semoga bisa membantu, selamat coding
sumber