Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah Saya Boleh Mencapai Penapisan Output Baris demi Baris Tidak Menyekat daripada Subproses dalam Python?

Bagaimanakah Saya Boleh Mencapai Penapisan Output Baris demi Baris Tidak Menyekat daripada Subproses dalam Python?

Mary-Kate Olsen
Lepaskan: 2024-12-10 14:09:10
asal
316 orang telah melayarinya

How Can I Achieve Non-Blocking Line-by-Line Output Filtering from Subprocesses in Python?

Penapisan Output Tidak Menyekat daripada Subproses: Pendekatan Baris demi Baris

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.

Masalah Output Tertunda

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)
Salin selepas log masuk

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())
Salin selepas log masuk

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.

Ketidakcekapan Iterator

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()
Salin selepas log masuk

Pendekatan ini membolehkan kami membaca output baris demi baris apabila ia tersedia, menghapuskan kelewatan dan menyediakan lebih banyak proses penapis responsif.

Kesimpulan

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan