Rumah > Artikel > pembangunan bahagian belakang > Mengapa Python Saya `subproses` Hang Apabila Membaca Output daripada Program C Menggunakan `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(stdout, (char *) NULL, _IOLBF, 0);
stdbuf -oL ./main
Pseudo-TTY
import pty master_fd, slave_fd = pty.openpty() process = Popen("./main", stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, bufsize=0, close_fds=True)
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!