【发布时间】:2022-01-07 21:15:34
【问题描述】:
我有一个包含两个任务的异步程序:
- 任务 1 做了一些工作
- task 2 提供了一个命令行界面 (CLI),它从用户那里读取命令并将它们发送给 task 1 进行处理
CLI 基本上是一个从连接到标准输入的异步流中读取行的循环。
它有效,但不是很舒服。问题是输入行没有提供除[BACKSPACE ctrl-H] 和[ctrl-U] 之外的编辑命令,它们是在Linux 终端级别而不是在程序中处理的。我至少想要 [LEFT] 和 [RIGHT] 箭头以及 [DEL]。
我尝试了内置 input() 和 readline 导入,这给了我一个舒适的编辑,但它必须在单独的线程中运行,因为它是阻塞的 (loop.run_in_executor)。
现在问题是 [ctrl-C] 处理 (KeyboardInterrupt)。任务被取消,但input() 在它自己的线程中仍然等待[ENTER] 键。只有在 [ENTER] 后,应用程序才会退出。这太令人困惑了,对于这种方法来说,它是一个“阻止程序错误”。不幸的是,不可能杀死一个线程,所以我无法使 [ctrl-C] 按键正常终止程序。
您知道如何解决input() 的问题,或者您知道如何在异步任务中启用基本输入行编辑的另一种方法?
【问题讨论】:
-
@furas prompt-toolkit 看起来有大量的特性和比我需要的更多的功能,但它有一个异步接口,所以绝对是我应该测试的东西。谢谢你的提示。
-
我只是偶然偶然发现了你的问题:(stackoverflow.com/q/58454190/14412190)。这可能很有趣。
-
我在没有阅读文档的情况下快速尝试
aioconsole.ainput,但没有编辑功能。
标签: python python-asyncio readline