在 Python 中使用子进程运行 C 程序在读取输出时可能会很棘手C 程序。在这种情况下,Python 脚本冻结在“for line in iter(process.stdout.readline, '')”。
这里的问题是缓冲。默认情况下,C 程序在写入管道时对其标准输出使用块缓冲(就像从 Python 运行程序时的情况一样)。这意味着在缓冲区已满或程序终止之前,数据不会刷新。
有多种方法可以解决此问题:
1.修改C程序:
添加setvbuf(stdout, (char *) NULL, _IOLBF, 0);在 C 程序的开头强制进行行缓冲。这将在每个换行符后刷新缓冲区。
2.使用stdbuf工具:
通过stdbuf工具重定向C程序的stdout来控制缓冲行为。例如:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=subprocess.PIPE, bufsize=1) for line in iter(process.stdout.readline, ''): print(line)
3。使用伪 TTY:
使用伪 TTY 来模拟 C 程序的交互式终端环境。这将强制程序使用行缓冲。
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
4.从两端读取:
使用 Python 中的 select 函数同时从 C 程序的 stdout 和 Python 脚本的 stdin 读取。即使 C 程序没有产生任何输出,这也会解除 Python 脚本的阻塞。
以上是为什么从 C 程序读取输出时我的 Python 子进程挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!