Autoreload of modules in IPython

204,966

Solution 1

For IPython version 3.1, 4.x, and 5.x

%load_ext autoreload
%autoreload 2

Then your module will be auto-reloaded by default. This is the doc:

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.

There is a trick: when you forget all of the above when using ipython, just try:

import autoreload
?autoreload
# Then you get all the above

Solution 2

As mentioned above, you need the autoreload extension. If you want it to automatically start every time you launch ipython, you need to add it to the ipython_config.py startup file:

It may be necessary to generate one first:

ipython profile create

Then include these lines in ~/.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')

As well as an optional warning in case you need to take advantage of compiled Python code in .pyc files:

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

edit: the above works with version 0.12.1 and 0.13

Solution 3

REVISED - please see Andrew_1510's answer below, as IPython has been updated.

...

It was a bit hard figure out how to get there from a dusty bug report, but:

It ships with IPython now!

import ipy_autoreload
%autoreload 2
%aimport your_mod

# %autoreload? for help

... then every time you call your_mod.dwim(), it'll pick up the latest version.

Solution 4

If you add file ipython_config.py into the ~/.ipython/profile_default directory with lines like below, then the autoreload functionality will be loaded on IPython startup (tested on 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')

Solution 5

You can use:

  import ipy_autoreload
  %autoreload 2 
  %aimport your_mod
Share:
204,966

Related videos on Youtube

Thomas Parslow
Author by

Thomas Parslow

Updated on December 07, 2021

Comments

  • Thomas Parslow
    Thomas Parslow over 2 years

    Is there a way to have IPython automatically reload all changed code? Either before each line is executed in the shell or failing that when it is specifically requested to. I'm doing a lot of exploratory programming using IPython and SciPy and it's quite a pain to have to manually reload each module whenever I change it.

  • Jed
    Jed almost 13 years
    What if it is less direct? %run sometest.py contains import themod. After editing themod.py, I'd like to just %run sometest.py, but it doesn't pick up the changes.
  • SirVer
    SirVer over 12 years
    I think ipython 0.11 did away with this feature. Or is it just renamed/hidden someplace?
  • Mike McCabe
    Mike McCabe over 12 years
    SirVer, you're right. Sigh. Evidently, it's in the 'quarantine' package: archlinux.org/packages/community/any/ipython/files
  • Mike McCabe
    Mike McCabe over 12 years
    Explanation here - with an invitation to port to 0.11 :) 'from IPython.quarantine import ipy_autoreload' succeeds, and creates an %autoreload command... but in my initial tests, it doesn't seem to work.
  • Mike McCabe
    Mike McCabe over 12 years
    Looks like it's back in as of 9/30/2011 - so maybe we'll see it in an upcoming release. github.com/ipython/ipython/pull/746
  • Ehtesh Choudhury
    Ehtesh Choudhury over 11 years
    This is actually great. I was wondering why no one else was posting solutions to preserve it. Does this work with older versions of IPython as well? I've been using 0.12+. I recall that the way ipython stores customizations changed significantly.
  • kara deniz
    kara deniz over 11 years
    I'm using 0.12.1, and haven't yet tried 0.13, so I don't know whether it will work with 0.13+
  • dvreed77
    dvreed77 almost 11 years
    This is a good approach, but I think all you need to do is fill in the extenstions which should be around line 27: c.InteractiveShellApp.extensions = ['autoreload']
  • spinxz
    spinxz almost 11 years
    use c.InteractiveShellApp.extensions = ['autoreload'], and c.InteractiveShellApp.exec_lines = ['%autoreload 2']. I am not sure but in the default profile of version 0.13 under Ubuntu 13.04 I found a 'startup' folder that contains a script '50_autoreload.ipy' to activate autoreload. Maybe nothing is required at all
  • dashesy
    dashesy over 10 years
    I have to find this answer on any new install, this is the only sane config for development in iPython.
  • Leon
    Leon almost 10 years
    This file doesnt seem to be there by default so you might have to create it as he said. Also before the code add ... c = get_config() #Should be first line
  • exfizik
    exfizik over 9 years
    What if I wanted to do "from moduleX import blah"?
  • Frederick Nord
    Frederick Nord over 9 years
    Is this still needed for ipython 1.2.1.? And 3.0.0?
  • dashesy
    dashesy almost 8 years
    Since --pylab is not longer an option I use c.InteractiveShellApp.exec_lines = ['%autoreload 2', '%pylab']
  • alpha_989
    alpha_989 about 6 years
    Is there a way to do this in ipdb? Say, I am in ipd, and I notice a line didnt work. So I changed the line, and want to reload the file. Will this work?
  • edesz
    edesz over 4 years
    @exfizik, IIUC, I think you need %aimport moduleX and then (on a subsequent line in the notebook) from moduleX import blah
  • user3897315
    user3897315 about 3 years
    An improvement to the first line first checks to see if autoreload has already been loaded: if 'autoreload' not in get_ipython().extension_manager.loaded:\n %load_ext autoreload\n %autoreload 2. This will get rid of the following error that appears when executing the command again: The autoreload extension is already loaded. To reload it, use:\n %reload_ext autoreload.
  • Coding Tumbleweed
    Coding Tumbleweed almost 3 years
    What does 2 in %autoreload 2 mean?
  • eth4io
    eth4io almost 3 years
    the 2 in %autoreload 2 means Reload all modules (except those excluded by %aimport) every time before executing the Python code typed. ipython.org/ipython-doc/3/config/extensions/autoreload.html
  • Joakim
    Joakim about 2 years
    If you want this set automatically on every session in PyCharm, you can add it to the startup script in Settings → Buld, Execution, Deployment → Console → Python Console → Startup Script. You must use a Conda interpreter to get it to work in PyCharm.