【问题标题】:Reloading a Python extension module from IPython从 IPython 重新加载 Python 扩展模块
【发布时间】:2013-08-13 18:51:04
【问题描述】:

使用 Cython,我正在开发一个扩展模块,它被构建为 .so 文件。然后我使用 IPython 对其进行测试。在开发过程中,我经常需要进行更改和重建。我还需要退出 IPython shell 并重新输入所有命令。使用

重新导入模块
import imp
imp.reload(Extension)

不起作用,代码没有更新。有没有办法让我在重建模块后避免重新启动 IPython shell?

【问题讨论】:

    标签: python python-3.x ipython cython


    【解决方案1】:

    如果不重新启动进程,则无法重新加载 C 扩展(请参阅this official Python bug 了解更多信息)。

    由于您已经在使用 IPython,如果您可以接受,我可能会建议您使用两个进程接口之一,例如 Notebook 或 QtConsole。这些允许您轻松重新启动内核进程,从而允许您重新加载模块。显然,这不如重新加载 Python 模块方便,因为您必须重新执行才能恢复到相同的状态。但这是无法避免的,所以重点是减轻不便。

    我发现笔记本界面最方便开发扩展,因为它提供了最简单的方法来回到相同的状态:

    1. 重建扩展
    2. 重启内核
    3. Run All 重新执行 notebook

    并且您使用新版本的扩展程序恢复到相同的状态。里程可能会有所不同,具体取决于重新运行交互式工作的成本,但它对我很有帮助。

    【讨论】:

      【解决方案2】:

      您可以尝试在ipython shelldocumentation here 中设置autoreload

      设置autoreload

      In [1]: %load_ext autoreload
      
      In [2]: %autoreload 2
      

      在特定模块上设置autoreload

      %aimport foo
      

      另外,看看dreload(更多关于dreloadhere)和run-magic

      【讨论】:

      • 它不适用于我的情况,自动重载文档指出:“C 扩展模块无法重新加载,因此无法自动重载。”
      【解决方案3】:

      IPython 提供了automatically reload modules 的方法:

      In [1]: %load_ext autoreload
      In [2]: %autoreload 2
      

      其他你可以使用(编辑:仅限 python 2)

      reload(module)
      

      请参阅this answer 了解 python3 重新加载。

      【讨论】:

      • 幽默,你比我晚 5 秒回答。当它发生时非常酷。
      • reload 我相信不是 Python 3 的内置函数。
      • :x 我会重定向到这个question 但我对系统不够熟悉@cls: 哎呀,我的错
      猜你喜欢
      • 2016-05-20
      • 2018-12-17
      • 2011-07-18
      • 2012-01-07
      • 1970-01-01
      • 2010-12-26
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多