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

为什么从 C 程序的“stdout”读取时我的 Python“子进程”挂起?

DDD
DDD原创
2024-11-18 05:07:02488浏览

Why Does My Python `subprocess` Hang When Reading from a C Program's `stdout`?

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

当尝试从 Python 脚本运行 C 程序时,用户可能会在 Python 代码中的“for line in iter”语句处遇到悬而未决的问题。当使用 subprocess 读取 C 程序的输出时会发生这种情况,在本例中是一个连续打印“2000”的测试程序。

理解问题

这种挂起行为的根本原因在于标准输出缓冲区管理。默认情况下,C 程序生成块缓冲输出,这意味着数据会以大块的形式写入 stdout。当 stdout 重定向到管道时(如子进程的情况),这种缓冲可能会导致读取输出的延迟。

解决方案

1.修改 C 程序缓冲:

要解决此问题,可以修改 C 程序以使用行缓冲 stdout。这可确保立即刷新每个新行,从而消除与缓冲区相关的延迟。

2.使用伪 TTY:

另一种解决方案是使用伪终端 (pty)。 PTY 为 C 程序提供了一个伪 tty 接口,欺骗它认为它正在交互运行。这自然会启用标准输出的行缓冲。

3。使用特殊实用程序:

像 stdbuf 这样的实用程序可用于修改子进程的缓冲行为,而无需修改源代码。以下 Python 代码演示了如何使用 stdbuf:

import subprocess

process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1)
for line in iter(process.stdout.readline, b''):
    print(line)

4.使用 pexpect:

Pexpect 是一个简化 pty 处理的模块。它可以按如下方式使用:

import pexpect

child = pexpect.spawn("./main")
for line in child:
    print(line)

通过实施这些解决方案,Python 脚本将能够及时读取 C 程序的输出。这解决了“for line in iter”语句处的挂起问题。

以上是为什么从 C 程序的“stdout”读取时我的 Python“子进程”挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!

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