Menggunakan subproses untuk menjalankan program C dalam Python boleh menjadi rumit apabila membaca output daripada program C. Dalam kes ini, skrip Python membeku pada "for line in iter(process.stdout.readline, '')".
Isu di sini ialah penimbalan. Secara lalai, program C menggunakan penimbalan blok untuk stdout mereka semasa menulis ke paip (seperti yang berlaku semasa menjalankan program daripada Python). Ini bermakna data tidak disiram sehingga penimbal penuh atau program ditamatkan.
Terdapat beberapa cara untuk menangani isu ini:
1. Ubah suai Program C:
Tambah setvbuf(stdout, (char *) NULL, _IOLBF, 0); pada permulaan program C untuk memaksa penimbal talian. Ini akan membuang penimbal selepas setiap baris baharu.
2. Gunakan Alat stdbuf:
Ubah hala stdout program C melalui alat stdbuf untuk mengawal tingkah laku penimbalan. Contohnya:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=subprocess.PIPE, bufsize=1) for line in iter(process.stdout.readline, ''): print(line)
3. Gunakan Pseudo-TTY:
Gunakan pseudo-TTY untuk mensimulasikan persekitaran terminal interaktif untuk program C. Ini akan memaksa atur cara menggunakan penimbalan talian.
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
4. Baca dari Kedua-dua Hujung:
Gunakan fungsi pilih dalam Python untuk membaca daripada kedua-dua stdout program C dan stdin skrip Python secara serentak. Ini akan menyahsekat skrip Python walaupun program C tidak menghasilkan sebarang output.
Atas ialah kandungan terperinci Mengapakah Subproses Python Saya Menggantung Semasa Membaca Output daripada Program C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!