Python 打印或写入到标准输出时发生BlockingIOError
当我从一个需要终端处于“raw”模式的程序中写入tty时,我得到了很少的文档记录,也很少出现在web“BlockingIOError”中 在Unix(Linux,Mac)中,将终端切换到raw是获取要显示的行的方法 不打印换行符,更重要的是,阅读任何键入的内容 无需等待Python 打印或写入到标准输出时发生BlockingIOError,python,posix,nonblocking,tty,Python,Posix,Nonblocking,Tty,当我从一个需要终端处于“raw”模式的程序中写入tty时,我得到了很少的文档记录,也很少出现在web“BlockingIOError”中 在Unix(Linux,Mac)中,将终端切换到raw是获取要显示的行的方法 不打印换行符,更重要的是,阅读任何键入的内容 无需等待键 检查在Python中执行此操作的可靠方法 但是,当将数据打印到原始终端时,我会在随机时间让程序终止,并出现BlockingIOError异常 (我甚至构建了一个重试机制来解决这个问题,但有时根本无法解决) github上的一些
键
检查在Python中执行此操作的可靠方法
但是,当将数据打印到原始终端时,我会在随机时间让程序终止,并出现BlockingIOError
异常
(我甚至构建了一个重试机制来解决这个问题,但有时根本无法解决)
github上的一些问题中出现了异常,没有关于如何修复它的断言。
用我的项目触发它的方法是:
import terminedia as TM
with TM.keyboard: # enables the use of TM.inkey() for realtime keyboard reading
print("*" * 100_000)
(您可以
pip安装terminedia
来尝试)这段代码,创建了一个上下文管理器,它可以立即将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
)