21

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

import imp
imp.reload(Extension)

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

4

3 回答 3

18

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

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

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

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

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

于 2013-08-16T06:03:01.633 回答
0

您可以尝试autoreload在此处的ipython shell文档设置一个。

autoreload

In [1]: %load_ext autoreload

In [2]: %autoreload 2

autoreload在特定模块上设置

%aimport foo

另外,看看dreload(更多在dreload 这里)和运行魔法

于 2013-08-13T18:55:18.330 回答
-2

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

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

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

reload(module)

请参阅此答案以了解 python3 重新加载。

于 2013-08-13T18:55:23.040 回答