Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印或写入到标准输出时发生BlockingIOError_Python_Posix_Nonblocking_Tty - Fatal编程技术网

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

Python 打印或写入到标准输出时发生BlockingIOError,python,posix,nonblocking,tty,Python,Posix,Nonblocking,Tty,当我从一个需要终端处于“raw”模式的程序中写入tty时,我得到了很少的文档记录,也很少出现在web“BlockingIOError”中 在Unix(Linux,Mac)中,将终端切换到raw是获取要显示的行的方法 不打印换行符,更重要的是,阅读任何键入的内容 无需等待键 检查在Python中执行此操作的可靠方法 但是,当将数据打印到原始终端时,我会在随机时间让程序终止,并出现BlockingIOError异常 (我甚至构建了一个重试机制来解决这个问题,但有时根本无法解决) github上的一些

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

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

检查在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