首页  >  文章  >  后端开发  >  为什么从 C 程序读取输出时我的 Python 子进程挂起?

为什么从 C 程序读取输出时我的 Python 子进程挂起?

Linda Hamilton
Linda Hamilton原创
2024-11-19 00:57:02711浏览

Why Does My Python Subprocess Hang When Reading Output from a C Program?

Python C 程序子进程挂在“for line in iter”

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn