从IPython重新加载Python扩展模块

22

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

import imp
imp.reload(Extension)

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

3个回答

19

C扩展无法在不重新启动进程的情况下重新加载(有关更多信息,请参见这个官方Python bug)。

由于您已经在使用IPython,如果您觉得可以接受,我建议使用其中之一的双进程界面,例如Notebook或QtConsole。这些界面允许您轻松“重新启动”内核进程,从而可以重新加载模块。显然,这对于Python模块的重新加载来说并不像reload那么方便,因为您必须重新执行以返回到相同的状态。但是这是不可避免的,所以重点是减轻不便。

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

  1. 重建扩展
  2. 重新启动内核
  3. 按“运行全部”以重新执行笔记本

然后您就回到了相同的状态,并具有扩展的新版本。根据您的交互工作的成本如何重新运行,效果可能会有所不同,但在我的使用中效果很好。


0
你可以尝试在 ipython shell 中设置 autoreload这里有文档
设置 autoreload
In [1]: %load_ext autoreload

In [2]: %autoreload 2

设置特定模块的autoreload

%aimport foo

此外,还要看一下dreload(更多关于dreload的信息在这里)和run-magic

4
这对我的情况没有用,autoreload文档说明:"C扩展模块无法重新加载,因此无法进行自动重新加载。" - clstaudt

-2

IPython 提供了一种自动重新加载模块的方式:

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

否则你可以使用(已编辑:仅适用于Python 2)

reload(module)

请参考此答案了解Python3的重新加载。


有趣的是,你在我之后5秒钟回答了。当这种事情发生时,感觉非常酷。 - user1786283
我认为在Python 3中reload不是内置的。 - clstaudt
我本来想重定向到这个问题(https://dev59.com/rG435IYBdhLWcg3wiggk),但是我对这个系统不够熟悉。@cls: 哎呀,我的错。 - Laurent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接