如何从tornado事件循环中调用prompt_toolkit?

时间:2016-09-30 16:46:32

标签: python tornado prompt toolkit

我正在尝试使用来自使用tornado事件循环的应用程序的prompt_toolkit,但是我无法找到将prompt_toolkit提示添加到事件循环的正确方法。

prompt_toolkit文档中有一个在asyncio(Asyncio Docs)中使用它的示例:

from prompt_toolkit.shortcuts import prompt_async

async def my_coroutine():
    while True:
        result = await prompt_async('Say something: ', patch_stdout=True)
        print('You said: %s' % result)

我已经设法从asyncio事件循环中完成这项工作:

import asyncio
l = asyncio.get_event_loop()
l.create_task(my_coroutine())
l.run_forever()

Say something: Hello
You said: Hello

但是,我没能在龙卷风事件循环中使其工作。我尝试过以下方法:

from tornado.ioloop import IOLoop
IOLoop.current().run_sync(my_coroutine)

这将发出初始提示,但似乎会阻止控制台。

我也尝试过:

IOLoop.current().add_callback(my_coroutine)
IOLoop.current().start()

这会做同样的事情,但也会产生错误信息:

RuntimeWarning: coroutine 'my_coroutine' was never awaited

我试过了:

IOLoop.current().spawn_callback(my_coroutine)
IOLoop.current().start()

我在这里显然不明白。

任何人都可以对如何做到这一点有所了解吗?

我正在使用:Python 3.5.0,tornado 4.3。

1 个答案:

答案 0 :(得分:0)

要使用Tornado's asyncio integration,您必须告诉Tornado使用asyncio事件循环。通常,这意味着在您的应用开始时执行此操作:

output = [l[:-1] for l in x]