Bacaan Tidak Menyekat pada Paip Subproses dalam Python
Paip subproses menyediakan cara untuk berkomunikasi dengan program luaran dari dalam Python. Walau bagaimanapun, membaca daripada output standard secara lalai menyekat proses sehingga data tersedia. Untuk aplikasi yang memerlukan bacaan tanpa sekatan, terdapat beberapa pendekatan yang perlu dipertimbangkan.
Elakkan fcntl, pilih dan asyncproc
Walaupun lazimnya dicadangkan, fcntl, pilih dan asyncproc mungkin tidak sesuai untuk senario ini. fcntl dan pilih memerlukan kod khusus platform, manakala asyncproc bergantung pada pemproses berbilang, yang boleh memperkenalkan overhed tambahan dan berinteraksi dengan buruk dengan paip.
Penyelesaian Berasaskan Barisan
Satu yang boleh dipercayai dan penyelesaian mudah alih ialah menggunakan panggilan Queue.get_nowait(). Begini caranya:
from queue import Queue, Empty from subprocess import PIPE, Popen from threading import Thread # Initialize a subprocess and a queue for output p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1) q = Queue() # Create a thread to enqueue output from the subprocess t = Thread(target=enqueue_output, args=(p.stdout, q)) t.daemon = True t.start() # Read the queue in a non-blocking manner try: line = q.get_nowait() except Empty: print('No output yet') else: # ... process the output line
Dalam pendekatan ini, urutan berasingan digunakan untuk memasukkan keluaran daripada subproses ke dalam baris gilir. Proses utama kemudiannya boleh cuba mendapatkan data dari baris gilir tanpa menyekat. Jika baris gilir kosong, ia mengembalikan pengecualian Kosong.
Penyelesaian ini mudah alih dan cekap, dan ia membenarkan bacaan tanpa sekatan pada paip subproses tanpa memerlukan kod khusus platform atau kebergantungan tambahan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Bacaan Tidak Menyekat daripada Paip Subproses dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!