Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa `subproses` Python Saya Bergantung Semasa Membaca daripada `stdout` Program C?

Mengapa `subproses` Python Saya Bergantung Semasa Membaca daripada `stdout` Program C?

DDD
Lepaskan: 2024-11-18 05:07:02
asal
577 orang telah melayarinya

Why Does My Python `subprocess` Hang When Reading from a C Program's `stdout`?

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan