关于python:在IPython中自动加载模块

Autoreload of modules in IPython

本问题已经有最佳答案,请猛点这里访问。

有没有办法让IPython自动重新加载所有更改的代码? 在每个行在shell中执行之前,或者在特别请求它时失败。 我正在使用IPython和SciPy进行大量的探索性编程,每当我更改它时,必须手动重新加载每个模块是非常痛苦的。


对于IPython版本3.1,4.x和5.x.

1
2
%load_ext autoreload
%autoreload 2

然后默认情况下会自动重新加载您的模块。这是文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
File:       ...my/python/path/lib/python2.7/site-packages/IPython/extensions/autoreload.py

Docstring:
``autoreload`` is an IPython extension that reloads modules
automatically before executing the line of code typed.

This makes for example the following workflow possible:

.. sourcecode:: 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

The module was reloaded without reloading it explicitly, and the
object imported with ``from foo import ...`` was also updated.

有一个技巧:当你在使用ipython时忘记了以上所有内容时,试试:

1
2
3
import autoreload
?autoreload
# Then you get all the above


如上所述,您需要autoreload扩展名。如果您希望每次启动ipython时自动启动它,则需要将其添加到ipython_config.py启动文件中:

可能有必要先生成一个:

1
ipython profile create

然后在~/.ipython/profile_default/ipython_config.py中包含以下行:

1
2
3
c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')

除了需要利用.pyc文件中编译的Python代码之外的可选警告:

1
c.InteractiveShellApp.exec_lines.append('print"Warning: disable autoreload in ipython_config.py to improve performance." ')

编辑:以上版本适用于版本0.12.1和0.13


修订 - 请参阅下面的Andrew_1510答案,因为IPython已经更新。

...

有点难以弄清楚如何从尘土飞扬的错误报告中找到答案,但是:

它现在随附IPython!

1
2
3
4
5
import ipy_autoreload
%autoreload 2
%aimport your_mod

# %autoreload? for help

...然后每当你打电话给your_mod.dwim()时,它都会拿起最新的版本。


如果你使用下面的行将ipython_config.py添加到?/ .ipython / profile_default目录中,那么将在ipython启动时加载自动加载功能(在2.0.0上测试):

1
2
3
4
5
6
print"--------->>>>>>>> ENABLE AUTORELOAD <<<<<<<<<------------"

c = get_config()
c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')

您可以使用:

1
2
3
  import ipy_autoreload
  %autoreload 2
  %aimport your_mod

有一个扩展,但我没有使用经验:

http://ipython.scipy.org/ipython/ipython/attachment/ticket/154/ipy_autoreload.py