从IPython重新加载Python扩展模块

时间:2013-08-13 18:51:04

标签: python python-3.x ipython cython

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

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

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

3 个答案:

答案 0 :(得分:18)

如果不重新启动流程,则无法重新加载C扩展(有关详细信息,请参阅this official Python bug)。

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

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

  1. 重建扩展程序
  2. 重启内核
  3. 全部运行以重新执行笔记本
  4. 并且您使用新版本的扩展程序返回到相同的状态。里程可能会有所不同,具体取决于您的互动作品重新投入的成本,但它对我有利。

答案 1 :(得分:0)

您可以尝试在autoreloaddocumentation here中设置ipython shell

设置autoreload

In [1]: %load_ext autoreload

In [2]: %autoreload 2

在特定模块上设置autoreload

%aimport foo

另外,请查看dreloaddreload here上的更多内容)和run-magic

答案 2 :(得分:-2)

IPython为automatically reload modules提供了一种方式:

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

否则你可以使用(仅限编辑:python 2)

reload(module)

有关python3 reload的信息,请参阅this answer