使用Cython,我正在开发一个扩展模块,它将构建为.so文件。然后我使用IPython测试它。在开发过程中,我经常需要进行更改和重建。我还需要退出IPython shell并重新输入所有命令。使用
重新导入模块import imp
imp.reload(Extension)
不起作用,代码未更新。在重建模块后,有没有办法避免重启IPython shell?
答案 0 :(得分:18)
如果不重新启动流程,则无法重新加载C扩展(有关详细信息,请参阅this official Python bug)。
由于您已经在使用IPython,我建议您使用其中一个双进程接口,例如Notebook或QtConsole,如果您可以接受的话。这些允许您轻松重新启动内核进程,从而允许您重新加载模块。显然,这不像重新加载Python模块那样方便,因为你必须重新执行才能返回到相同的状态。但这是不可避免的,所以重点是减轻不便。
我发现笔记本界面最适合开发扩展,因为它提供了回到相同状态的最简单方法:
并且您使用新版本的扩展程序返回到相同的状态。里程可能会有所不同,具体取决于您的互动作品重新投入的成本,但它对我有利。
答案 1 :(得分:0)
您可以尝试在autoreload
,documentation here中设置ipython shell
。
设置autoreload
In [1]: %load_ext autoreload
In [2]: %autoreload 2
在特定模块上设置autoreload
%aimport foo
答案 2 :(得分:-2)
IPython为automatically reload modules提供了一种方式:
In [1]: %load_ext autoreload
In [2]: %autoreload 2
否则你可以使用(仅限编辑:python 2)
reload(module)
有关python3 reload的信息,请参阅this answer。