重要

本文档涵盖 IPython 6.0 及更高版本。从 6.0 版本开始,IPython 不再支持与低于 3.3 的 Python 版本(包括所有版本的 Python 2.7)兼容。

如果你正在寻找与 Python 2.7 兼容的 IPython 版本,请使用 IPython 5.x LTS 版本并参阅其文档(LTS 是长期支持版本)。

自动重新加载

%autoreload

在执行用户代码之前重新加载模块的 IPython 扩展。

autoreload 在输入 IPython 提示符处的代码执行之前自动重新加载模块。

例如,这使得以下工作流成为可能

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43

该模块已重新加载,而无需显式重新加载它,并且使用 from foo import ... 导入的对象也已更新。

用法

提供了以下魔术命令

%autoreload, %autoreload now

立即自动重新加载所有模块(%aimport 排除的模块除外)。

%autoreload 0, %autoreload off

禁用自动重新加载。

%autoreload 1, %autoreload explicit

每次在执行输入的 Python 代码之前,重新加载使用 %aimport 导入的所有模块。

%autoreload 2, %autoreload all

每次在执行输入的 Python 代码之前,重新加载所有模块(%aimport 排除的模块除外)。

%autoreload 3, %autoreload complete

与 2/all 相同,但还添加了模块中的任何新对象。请参阅 IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects 中的单元测试

%autoreload 行添加 --print-p 将打印自动重新加载活动到标准输出。--log-l 将以 INFO 级别将其记录到日志;两者可以同时使用。

%aimport

列出要自动导入或不导入的模块。

%aimport foo

导入模块“foo”并将其标记为自动重新加载,代码为 %autoreload 1

%aimport foo, bar

导入模块“foo”、“bar”并将其标记为自动重新加载,代码为 %autoreload 1

%aimport -foo

将模块“foo”标记为不自动重新加载。

注意事项

以可靠的方式重新加载 Python 模块通常很困难,并且可能会发生意外情况。 %autoreload 尝试通过用新版本替换模块中先前存在的函数代码对象和类部分来解决常见问题。这使得以下内容有效

  • 当重新加载“xxx”时,通过“from xxx import foo”导入的函数和类将升级到新版本。

  • 重新加载时,类的函数和属性会升级,以便在重新加载之前创建的对象“c”上调用“c.foo()”会导致执行“foo”的新代码。

已知的一些剩余注意事项是

  • 替换代码对象并不总是成功:将类中的 @property 更改为普通函数或将函数更改为成员变量可能会导致问题(但仅限于旧对象)。

  • 在重新加载之前从模块中删除的函数(例如,通过猴子补丁)不会升级。

  • C 扩展模块无法重新加载,因此无法自动重新加载。

  • 在比较 Enum 和 Flag 时,使用“is”标识运算符(即使使用了“==”的情况也一样(类似于“None”关键字)。

  • 重新加载模块或使用不同的名称导入同一模块,会创建新的 Enum。这些可能看起来相同,但并非如此。