打印或写入到标准输出时发生BlockingIOError

2024-10-01 01:42:35 发布

您现在位置:Python中文网/ 问答频道 /正文

当我从一个需要终端处于“raw”模式的程序中写入tty时,我得到了很少的文档记录,也很少出现在web“BlockingIOError”中

在Unix(Linux,Mac)中,将终端切换到raw是获取要显示的行的方法 不打印换行符,更重要的是,阅读任何键入的内容 无需等待<enter>

检查https://stackoverflow.com/a/6599441/108205以获得在Python中执行此操作的可靠方法

然而,当将数据打印到原始终端时,我会在随机时间让我的程序以BlockingIOError异常终止

(我甚至构建了一个重试机制来解决这个问题,但有时根本无法解决)

github上的一些问题中出现了异常,没有关于如何修复它的断言。 用我的项目触发它的方法是:

import terminedia as TM

with TM.keyboard:  # enables the use of TM.inkey() for realtime keyboard reading
    print("*" * 100_000)

(您可以pip install terminedia尝试)


Tags: 方法文档程序web终端rawlinux记录
1条回答
网友
1楼 · 发布于 2024-10-01 01:42:35

这段代码创建了一个上下文管理器,它可以立即将tty切换回“正常”阻塞模式,包装具有大量输出的部件,从而解决了我的问题:

import fcntl
import os
...

class UnblockTTY:

    def __enter__(self):
        self.fd = sys.stdin.fileno()
        self.flags_save = fcntl.fcntl(self.fd, fcntl.F_GETFL)
        flags = self.flags_save & ~os.O_NONBLOCK
        fcntl.fcntl(self.fd, fcntl.F_SETFL, flags)

    def __exit__(self, *args):
        fcntl.fcntl(self.fd, fcntl.F_SETFL, self.flags_save)

为完整起见,问题中的代码片段将通过以下方式修复:

import terminedia as TM

with TM.keyboard:  
    with TM.terminal.UnblockTTY():
        print("*" * 100_000)

(尽管在使用terminedia时,应该使用“Screen”类,而不是已经包装好的TM.print

相关问题 更多 >