用 asyncio 听按键

新手上路,请多包涵

有人可以提供一个代码示例,它使用 asynio 以非阻塞方式侦听按键,并在每次点击时将键码放在控制台中吗?

这不是关于某些图形工具包的问题

原文由 kharandziuk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 524
1 个回答

因此,Andrea Corbellini 提供的链接是对问题的巧妙而彻底的解决方案,但也相当复杂。如果您只想提示您的用户输入一些输入(或模拟 raw_input),我更愿意使用更简单的解决方案:

 import sys
import functools
import asyncio as aio

class Prompt:
    def __init__(self, loop=None):
        self.loop = loop or aio.get_event_loop()
        self.q = aio.Queue()
        self.loop.add_reader(sys.stdin, self.got_input)

    def got_input(self):
        aio.ensure_future(self.q.put(sys.stdin.readline()), loop=self.loop)

    async def __call__(self, msg, end='\n', flush=False):
        print(msg, end=end, flush=flush)
        return (await self.q.get()).rstrip('\n')

prompt = Prompt()
raw_input = functools.partial(prompt, end='', flush=True)

async def main():
    # wait for user to press enter
    await prompt("press enter to continue")

    # simulate raw_input
    print(await raw_input('enter something:'))

loop = aio.get_event_loop()
loop.run_until_complete(main())
loop.close()

编辑:我删除了循环参数形式 Queue 因为它在 3.10 中被删除了。

此外,这些天我使用结构化并发(trio),如果有人好奇这在 trio 中很容易做到:

 import trio, sys

async def main():
    async with trio.lowlevel.FdStream(sys.stdin.fileno()) as stdin:
            async for line in stdin:
                if line.startswith(b'q'):
                    break
                print(line)

trio.run(main)

原文由 bj0 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题