Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Mary-Kate Olsenasal
2024-11-18 05:23:02662semak imbas

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);
  • Utiliti stdbuf: Utiliti stdbuf boleh digunakan untuk membalut program C dan menukarnya penimbalan tingkah laku.
stdbuf -oL ./main

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)
  • 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

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!

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