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
Lepaskan: 2024-11-19 00:57:02
asal
768 orang telah melayarinya

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

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

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!

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