命令行上的无缓冲非阻塞键盘输入

时间:2016-03-17 16:47:18

标签: python stdin nonblocking

我想在 非阻塞的命令行 (无需等待换行)中捕获“全部”键盘输入 方式。

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

按键后如何对键盘输入立即做出反应?

2 个答案:

答案 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)