【问题标题】:Is there a way to call await directly in Jupyter cell?有没有办法直接在 Jupyter 单元中调用 await ?
【发布时间】:2018-11-22 19:59:58
【问题描述】:

我已经看到在某些环境中工作的此类代码示例(例如https://github.com/ipython/ipykernel/pull/323)。

但对我来说,到目前为止这只会引发SyntaxError

更新:

我知道在“纯”python 中它不起作用,await 应该只在async def 中使用。

我也知道在 jupyter 中它可能的(见上面的链接)所以引擎能够做到这一点。问题是如何摆脱这个错误信息。

更新2 直接调用await是什么思路:

我正在使用异步库。在当前版本的 jupyter 中,很难获得协程的返回值:

我想到的最好的方法是通过全局变量:

这里的一个问题是res 在单元格 25 中还没有准备好。我必须等到我看到“完成”,然后使用另一个单元格中的值。

另一个问题是直接从单元格调用协程和从另一个协程调用协程之间的语义不对称,这在编辑器中编写脚本时非常不相关,但对于 repl 非常重要。

现在考虑一下:

【问题讨论】:

    标签: python python-3.x async-await jupyter-notebook python-asyncio


    【解决方案1】:

    知道了!

    这需要安装 IPython 的开发版本 (https://github.com/ipython/ipython/pull/11155)。

    这是:

    pip install git+https://github.com/minrk/ipython.git@more-await-repl#egg=ipython

    pip install git+https://github.com/minrk/ipykernel.git@run-async#egg=ipykernel

    更新:

    正如@ack 所指出的,现在这个功能存在于 pypi 上的最新版本 ipykernel 中。

    【讨论】:

    • 这个“await at toplevel”功能在 IPython 7.0 中可用,并且 7.x 系列现在被认为是稳定的。有关更多信息,请参阅this blog post。如果您的环境没有足够新的 IPython 版本,则使用 pip install ipython ipykernel --upgrade 应该可以解决问题。
    • @ack 谢谢!如果您将此作为答案发布,我会接受。
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多