Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Subproses Python Saya Menggantung Semasa Membaca Output daripada Program C?

Mengapakah Subproses Python Saya Menggantung Semasa Membaca Output daripada Program C?

Linda Hamilton
Linda Hamiltonasal
2024-11-19 00:57:02772semak imbas

Why Does My Python Subprocess Hang When Reading Output from a C Program?

Subproses Program Python C Digantung pada "for line in iter"

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, '')".

Memahami Isu: Buffering

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.

Membetulkan Isu

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!

Kenyataan:
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