Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Python Saya `subproses` Hang Apabila Membaca Output daripada Program C Menggunakan `for line in iter(process.stdout.readline, \'\')`?

Mengapa Python Saya `subproses` Hang Apabila Membaca Output daripada Program C Menggunakan `for line in iter(process.stdout.readline, \'\')`?

Mary-Kate Olsen
Lepaskan: 2024-11-18 05:23:02
asal
744 orang telah melayarinya

Why Does My Python `subprocess` Hang When Reading Output from a C Program Using `for line in iter(process.stdout.readline, '')`?

Subproses Python digantung dengan "for line in iter"

Dalam senario ini, skrip Python bertujuan untuk melaksanakan program C dan menerima keluarannya. Walau bagaimanapun, skrip tergantung pada baris "for line in iter(process.stdout.readline, '')".

Isu Penampan

Masalah timbul daripada isu penimbal. Dalam program C, stdout biasanya ditimbalkan blok apabila output disalurkan. Ini bermakna output ditimbal sehingga jumlah tertentu ditulis atau baris baharu ditemui.

Dalam program C, setiap lelaran gelung sementara mencetak "2000" dan tidur seketika. Memandangkan tiada baris baharu dicetak, output ditimbalkan.

Untuk Line in Iter Issue

Dalam Python, subprocess.stdout.readline() membaca stdout kanak-kanak memproses dan mengembalikan baris. Gelung "for line in iter()" berulang ke atas baris yang dikembalikan oleh readline().

Walau bagaimanapun, memandangkan output program C tidak disiram kerana penimbalan, tiada baris untuk dibaca pada titik di mana skrip Python memasuki gelung. Oleh itu, skrip menunggu selama-lamanya di baris ini.

Penyelesaian

Betulkan Penimbalan dalam Program C

  • setvbuf(): Program C boleh menggunakan setvbuf() untuk memaksa baris penimbal untuk stdout. Ini akan memastikan bahawa setiap baris disiram serta-merta selepas mencetak.
setvbuf(stdout, (char *) NULL, _IOLBF, 0);
Salin selepas log masuk
  • Utiliti stdbuf: Utiliti stdbuf boleh digunakan untuk membalut program C dan menukarnya penimbalan tingkah laku.
stdbuf -oL ./main
Salin selepas log masuk

Pseudo-TTY

  • Modul Pty: Modul pty boleh digunakan untuk mencipta pseudo-TTY yang menipu program C untuk memikirkan ia berjalan secara interaktif. Dalam mod ini, output akan ditimbalkan baris secara lalai.
import pty
master_fd, slave_fd = pty.openpty()
process = Popen("./main", stdin=slave_fd, stdout=slave_fd, stderr=STDOUT,
                bufsize=0, close_fds=True)
Salin selepas log masuk
  • Pustaka pexpect: Pustaka peexpect menyediakan antara muka peringkat lebih tinggi untuk bekerja dengan ptys.
import pexpect
child = pexpect.spawn("./main")
for line in child:
    print line
Salin selepas log masuk

Dengan menggunakan salah satu daripada penyelesaian ini, isu penimbalan akan diselesaikan, membenarkan skrip Python membaca output program C seperti yang dijangkakan.

Atas ialah kandungan terperinci Mengapa Python Saya `subproses` Hang Apabila Membaca Output daripada Program C Menggunakan `for line in iter(process.stdout.readline, \'\')`?. 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