Bacaan Tidak Menyekat untuk Output Standard Subproses
Apabila menggunakan modul subproses untuk memulakan subproses dan menyambung kepada aliran keluaran standard mereka, ia adalah penting untuk melaksanakan bacaan tanpa sekatan untuk mengekalkan responsif program. Artikel ini menyelidiki teknik untuk mencapai bacaan tidak menyekat pada output standard subproses atau menilai ketersediaan data sebelum menggunakan .readline.
Pendekatan Penyekatan Tradisional
Biasanya, membaca terus output standard disekat, bermakna pelaksanaan dihentikan sehingga data tersedia. Ini ditunjukkan di bawah:
import subprocess p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE) output_str = p.stdout.readline()
Walau bagaimanapun, dalam pendekatan ini, pelaksanaan akan terhenti jika tiada data serta-merta hadir dalam strim.
Mengatasi Menyekat Bacaan dengan Queue.get_nowait ()
Untuk memintas menyekat bacaan, pendekatan merentas platform yang boleh dipercayai ialah untuk menggunakan modul Queue dan kaedah get_nowait()nya. Kaedah ini dengan anggun mengendalikan ketiadaan data dalam strim, membenarkan bacaan tanpa sekatan:
import sys from subprocess import PIPE, Popen from threading import Thread from queue import Queue, Empty ON_POSIX = 'posix' in sys.builtin_module_names def enqueue_output(out, queue): for line in iter(out.readline, b''): queue.put(line) out.close() p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX) q = Queue() t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True # thread dies with the program t.start() try: line = q.get_nowait() except Empty: print('no output yet') else: # got line # ... do something with line
Dalam pendekatan ini, urutan yang berasingan dihasilkan untuk terus beratur keluaran daripada output standard subproses ke dalam baris gilir. Benang utama kemudiannya boleh melakukan bacaan tanpa sekatan dengan memanggil get_nowait(). Jika baris gilir kosong, panggilan kembali tanpa menyekat, membenarkan urutan utama diteruskan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Bacaan Tidak Menyekat daripada Output Standard Subproses?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!