Dalam pengaturcaraan Python, keupayaan untuk menangkap dan memproses output daripada arahan luaran adalah penting. Satu senario biasa melibatkan penggunaan modul subproses untuk melaksanakan arahan dan mendapatkan semula outputnya. Walau bagaimanapun, cabaran timbul apabila output adalah meluas, dan kita perlu menapis dan memaparkannya secara berperingkat.
Pertimbangkan skrip Python berikut yang memanggil utiliti yang menjana大量输出:
import time i = 0 while True: print(hex(i)*512) i += 1 time.sleep(0.5)
Dalam proses induk kami, kami cuba membaca dan menapis output:
import subprocess proc = subprocess.Popen(['python', 'fake_utility.py'], stdout=subprocess.PIPE) for line in proc.stdout: # perform filtering logic print("test:", line.rstrip())
Pada mulanya, jangkaan ialah output daripada utiliti akan dipaparkan baris demi baris apabila ia tersedia. Walau bagaimanapun, ini tidak berlaku; sebaliknya, output hanya ditunjukkan selepas sejumlah besar telah dihasilkan.
Punca kelewatan ini terletak pada penggunaan gelung for over proc.stdout. Ini secara tersirat membaca keseluruhan output ke dalam ingatan sebelum memprosesnya secara berulang. Untuk menyelesaikan isu ini, kami boleh menggunakan kaedah yang lebih cekap: menggunakan readline().
import subprocess proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE) while True: line = proc.stdout.readline() if not line: break # perform filtering logic print "test:", line.rstrip()
Pendekatan ini membolehkan kami membaca output baris demi baris apabila ia tersedia, menghapuskan kelewatan dan menyediakan lebih banyak proses penapis responsif.
Menapis output daripada subproses boleh menjadi tugas biasa dalam Python. Dengan memahami nuansa penimbalan I/O dan menggunakan teknik yang cekap seperti readline(), pembangun boleh melaksanakan penapis tidak menyekat yang memproses dan memaparkan data secara berperingkat, meningkatkan responsif aplikasi mereka.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Penapisan Output Baris demi Baris Tidak Menyekat daripada Subproses dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!