使用Python中的
现在考虑以下非阻塞读取的最小化示例:
如果我在第一次输入时按下 Enter,那么会生成一个换行符,并且进程会正常结束。
然而,如果我先输入其他字符,然后再按下 Enter,进程就不会结束:我需要再次按下 Enter 才能结束。
显然,这个实现只在第一个输入为换行符时有效。
可能有很好的原因,但我目前还没有看到它,也找不到任何相关的问题。
这是与我的非阻塞实现有关,还是与 stdin 缓冲区有关,或者与控制台或终端实现有关呢?
(我正在 ubuntu 上的 python 3.8 shell 中运行此程序。)
selectors
结合sys.stdin
进行非阻塞控制台输入实验时,我有一个疑问:假设我想在用户按下Enter键后退出循环,可能先输入一些其他字符。如果我执行以下阻塞读取操作,则进程始终在遇到第一个换行符\n
后完成,而不管之前的任何字符,这是预期的:import sys
character = ''
while character != '\n':
character = sys.stdin.read(1)
现在考虑以下非阻塞读取的最小化示例:
import sys
import selectors
selector = selectors.DefaultSelector()
selector.register(fileobj=sys.stdin, events=selectors.EVENT_READ)
character = ''
while character != '\n':
for key, __ in selector.select(timeout=0):
character = key.fileobj.read(1)
如果我在第一次输入时按下 Enter,那么会生成一个换行符,并且进程会正常结束。
然而,如果我先输入其他字符,然后再按下 Enter,进程就不会结束:我需要再次按下 Enter 才能结束。
显然,这个实现只在第一个输入为换行符时有效。
可能有很好的原因,但我目前还没有看到它,也找不到任何相关的问题。
这是与我的非阻塞实现有关,还是与 stdin 缓冲区有关,或者与控制台或终端实现有关呢?
(我正在 ubuntu 上的 python 3.8 shell 中运行此程序。)
sys.stdin.buffer
会有什么区别吗? - AKX<enter>
(以及任何先前的输入)在 Python 进程退出后由 shell 处理。 - djvg