Python 子进程因“for line in iter”而挂起
在这种情况下,Python 脚本旨在执行 C 程序并接收它的输出。然而,脚本挂在了“for line in iter(process.stdout.readline, '')”行。
缓冲问题
问题产生于缓冲问题。在 C 程序中,当输出通过管道传送时,stdout 通常是块缓冲的。这意味着输出会被缓冲,直到写入一定量或遇到换行符为止。
在 C 程序中,while 循环的每次迭代都会打印“2000”并休眠一秒钟。由于没有打印换行符,因此输出被缓冲。
For Line in Iter Issue
在 Python 中, subprocess.stdout.readline() 读取子进程的 stdout处理并返回一行。 “for line in iter()”循环迭代 readline() 返回的行。
但是,由于 C 程序的输出由于缓冲而没有被刷新,因此此时没有要读取的行Python 脚本进入循环的位置。因此,脚本会在这一行无限期地等待。
解决方案
修复 C 程序中的缓冲
setvbuf(stdout, (char *) NULL, _IOLBF, 0);
stdbuf -oL ./main
伪 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
通过应用这些解决方案之一,缓冲问题将得到解决,允许 Python 脚本按预期读取 C 程序的输出。
以上是为什么当使用 `for line in iter(process.stdout.readline, \'\')` 从 C 程序读取输出时,我的 Python `subprocess` 挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!