Subproses program Python C digantung pada "untuk baris dalam iter"
Apabila cuba menjalankan program C daripada skrip Python, pengguna boleh menghadapi masalah tergantung pada pernyataan "for line in iter" dalam kod Python mereka. Ini berlaku apabila menggunakan subproses untuk membaca output program C, yang dalam kes ini ialah program ujian yang terus mencetak "2000."
Memahami Masalah
The punca kelakuan gantung ini terletak pada pengurusan penimbal stdout. Secara lalai, program C menghasilkan keluaran penimbal blok, bermakna data ditulis kepada stdout dalam ketulan besar. Apabila stdout dihalakan semula ke paip, seperti halnya dengan subproses, penimbalan ini boleh menyebabkan kelewatan dalam membaca output.
Penyelesaian
1. Ubah suai Penimbalan Program C:
Untuk menyelesaikan isu ini, seseorang boleh mengubah suai atur cara C untuk menggunakan stdout penampan baris. Ini memastikan bahawa setiap baris baharu dipadamkan serta-merta, menghapuskan kelewatan berkaitan penimbal.
2. Gunakan Pseudo-TTY:
Penyelesaian alternatif ialah menggunakan pseudo-terminal (pty). PTY menyediakan antara muka pseudo-tty kepada program C, memperdayakannya supaya berfikir ia berjalan secara interaktif. Ini secara semula jadi membolehkan penimbalan talian stdout.
3. Gunakan Utiliti Khas:
Utiliti seperti stdbuf boleh digunakan untuk mengubah suai gelagat penimbalan subproses tanpa mengubah suai kod sumber. Kod Python berikut menunjukkan cara menggunakan stdbuf:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1) for line in iter(process.stdout.readline, b''): print(line)
4. Gunakan pexpect:
Pexpect ialah modul yang memudahkan pengendalian ptys. Ia boleh digunakan seperti berikut:
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
Dengan melaksanakan penyelesaian ini, skrip Python akan dapat membaca output program C dengan segera. Ini menyelesaikan isu tergantung pada pernyataan "for line in iter".
Atas ialah kandungan terperinci Mengapa `subproses` Python Saya Bergantung Semasa Membaca daripada `stdout` Program C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!