我想在 非阻塞的命令行 (无需等待换行)中捕获“全部”键盘输入 方式。
This question演示了如何使用printSettings
以非阻塞方式从stdin
读取内容。这是它的工作原理:
select()
很遗憾,只有在按下 while True:
if select.select([sys.stdin], [], [], 0)[0] == [sys.stdin]:
print(sys.stdin.read(1))
... do other stuff ...
后才能获得结果。
我的第一个猜测是RETURN
只是行缓冲,因此在阅读this question之后我将代码转换为
stdin
这段代码效果更好 - 缓冲区被完全读取而没有中断 - 但它仍然等待 ubuf_stdin = os.fdopen(sys.stdin.fileno(), 'rb', buffering=0)
while True:
if select.select([ubuf_stdin], [], [], 0)[0] == [ubuf_stdin]:
print(ubuf_stdin.read(1))
... do other stuff ...
被按下。
我还尝试RETURN
detach
:
stdin
按键后如何对键盘输入立即做出反应?
答案 0 :(得分:0)
使用getch
模块一次获得一次按键,如this question中所述。
我不认为你能够以非阻塞性的方式一次性阅读标准输入,但它并不是为了这个目的。< / p>
答案 1 :(得分:0)
好的,这个人做了,但它有一些缺点:
curses
模块select()
。..但它的工作原理:)。
import curses
def read_stdin(self):
def cb(screen):
result = []
screen.nodelay(1)
while True:
try:
result.append(screen.getkey())
except curses.error:
return result
# contains a list of keys pressed since last call
return curses.wrapper(cb)