254

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

4

6 回答 6

426

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

%load_ext autoreload
%autoreload 2

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

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,只需尝试:

import autoreload
?autoreload
# Then you get all the above
于 2012-05-06T17:37:38.413 回答
111

如上所述,您需要autoreload扩展。如果你想让它在每次启动时自动启动ipython,你需要将它添加到ipython_config.py启动文件中:

可能需要先生成一个:

ipython profile create

然后将这些行包含在~/.ipython/profile_default/ipython_config.py

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

以及一个可选警告,以防您需要利用.pyc文件中已编译的 Python 代码:

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

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

于 2012-12-19T21:16:34.550 回答
68

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

...

从尘土飞扬的错误报告中弄清楚如何到达那里有点困难,但是:

它现在随 IPython 一起提供!

import ipy_autoreload
%autoreload 2
%aimport your_mod

# %autoreload? for help

...然后每次调用时your_mod.dwim(),它都会获取最新版本。

于 2011-01-22T00:12:08.500 回答
14

如果您将文件ipython_config.py添加到 ~/.ipython/profile_default 目录中,如下所示,则自动重载功能将在 IPython 启动时加载(在 2.0.0 上测试):

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')
于 2014-05-21T19:55:20.790 回答
2

您可以使用:

  import ipy_autoreload
  %autoreload 2 
  %aimport your_mod
于 2013-05-23T15:03:18.727 回答
0

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

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

于 2009-12-15T15:06:47.217 回答