2
A
回答
3
问题所以安德烈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(loop=self.loop)
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()
1
我写了一个名为aioconsole包的一部分,类似的东西。
它提供了一个名为get_standard_streams
协程返回对应于stdin
和。
下面是一个例子:
import asyncio
import aioconsole
async def echo():
stdin, stdout = await aioconsole.get_standard_streams()
async for line in stdin:
stdout.write(line)
loop = asyncio.get_event_loop()
loop.run_until_complete(echo())
它还包括一个异步相当于input
:
something = await aioconsole.ainput('Entrer something: ')
应该两个文件和非文件流工作。请参阅实施here。
1
使用队列将是使命令行的ASYN发生器,以及处理命令,因为他们进来,像这样的选择:
import asyncio
import sys
class UserInterface(object):
def __init__(self, task, loop):
self.task = task
self.loop = loop
def get_ui(self):
return asyncio.ensure_future(self._ui_task())
async def _ui_cmd(self):
while True:
cmd = sys.stdin.readline()
cmd = cmd.strip()
if cmd == 'exit':
self.loop.stop()
return
yield cmd
async def _ui_task(self):
async for cmd in self._ui_cmd():
if cmd == 'stop_t':
self.task.stop()
elif cmd == 'start_t':
self.task.start()
相关问题
- 1. 听按键或按钮按
- 2. ExtJS使用Ext.KeyMap监听全局按键
- 3. AS3监听按键,但全局监听
- 4. 听AppleScript中的按键
- 5. Android:听电源键按
- 6. 背景按键监听器
- 7. 听键盘按通知
- 8. Javascript关键听众按任意键
- 9. 如何使用按键侦听器调用类?
- 10. 如何监听即使没有焦点时按下的按键
- 11. 在按下热键后听下5个按键
- 12. 如何获得'enter'按键按键事件监听器?
- 13. Javafx ScrollPane监听键盘事件(按下按键)
- 14. 从Android的内部类使用硬件按键侦听器
- 15. 试图使用按键监听器,但形状不会移动
- 16. 使用asyncio和线程
- 17. 使用按键
- 18. jQuery:处理多个按键监听器?
- 19. Java听按钮和键盘单击
- 20. 简单的按键侦听器 - java
- 21. 注册长按音量键监听器
- 22. OSX Swift:如何收听按键?
- 23. 听Powershell的按键,但不要等待
- 24. 同时收听多个按键事件
- 25. 我想使用的按键侦听器监听,当我按在JTextArea进入,但它不工作
- 26. 怎么听回车键使用JOptionPane.showOptionDialog
- 27. 使用键盘“按下”TButtonedEdit按钮使用键盘
- 28. 在Swift中监听硬件键盘按键
- 29. 如何聆听Java中按下/键入的TAB键?
- 30. Android使侦听onClickListener的禁用按钮
你想等待标准的输入数据,或是关于图形工具包的问题吗?在后一种情况下,什么图形工具包? –
没有图形工具包只是一个控制台应用程序 – kharandziuk
在这里你可以找到一个从标准输入读取stdout的例子:https://gist.github.com/nathan-hoad/8966377 - 在这个例子中,stdin是行缓冲的(即你逐行阅读)。你想要一个无缓冲的stdin(这样你就可以读char-by-char) –