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