134

I have a foo.py

def foo():
    print "test"

In IPython I use:

In [6]:  import foo
In [7]:  foo.foo()
test

Then I changed the foo() to:

def foo():
    print "test changed"

In IPython, the result for invoking is still test:

In [10]:  import foo
In [11]:  foo.foo()
test

Then I use:

In [15]: del foo
In [16]:  import foo
In [17]:  foo.foo()
test

I delete the foo.pyc in same folder foo.py exists, but still no luck.

May I know how to reimport the updated code in runtime?

Jacquot
  • 1,750
  • 15
  • 25
user478514
  • 3,859
  • 10
  • 33
  • 42
  • 2
    Possible duplicate of [Reimport a module in python while interactive](http://stackoverflow.com/questions/1254370/reimport-a-module-in-python-while-interactive) – Praveen Jan 11 '16 at 17:28

5 Answers5

169

For Python 2.x

reload(foo)

For Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)
Rajat
  • 2,467
  • 2
  • 29
  • 38
John La Rooy
  • 295,403
  • 53
  • 369
  • 502
  • 23
    Actually, just "reload(foo)" - no need to re-attribute it – jsbueno Nov 06 '10 at 04:00
  • 2
    I couldn't get it work. I'm getiing TypeError: reload() argument must be module – Burak Nov 05 '12 at 10:12
  • 2
    @Burak, Is the argument you are passing to `reload` a module?. eg. You should be doing `import foo` beforehand – John La Rooy Nov 06 '12 at 03:25
  • Ok, I got it. I was passing the name of the function. Thank you. – Burak Nov 06 '12 at 08:02
  • 35
    Note that if you did `from foo import *` or `from foo import bar`, the symbol `foo` doesn't get defined. You need to `import sys` then `reload(sys.modules['foo'])` or perhaps `reload(sys.modules[bar.__module__])` – drevicko Oct 28 '13 at 01:02
  • However! See [this answer](http://stackoverflow.com/a/1254379/525169) for a long list of caveats. – Praveen Jan 11 '16 at 17:29
  • 3
    Please, let Python 2.x die a.s.p. and stop supporting Python 2.x ! A countdown for retirement of python 2.x https://pythonclock.org/ . – Martijn van Wezel Oct 27 '19 at 14:40
  • @MartijnvanWezel, yours is the first comment here since more than 3 years ago. Why bring attention to this question now then? – John La Rooy Oct 31 '19 at 00:02
  • This method might not override other modules' references to the reloaded module. See https://stackoverflow.com/a/61617169/2642356 for a solution to that. – EZLearner May 05 '20 at 15:59
  • @drevicko Thanks for your comment, which should be the accepted answer. All other answers included the accepted one, blindly point to `reload(name)` which only works if `name` is a module. – Celdor Jun 22 '21 at 13:15
  • 1
    I'd like to add to the expanded explanation from @drevicko : If you `import SomeLongModuleName as slmn` then you will want to do `importlib.reload( slmn )` – PfunnyGuy Jan 31 '23 at 21:27
88

IPython3's autoreload feature works just right.

I am using the actual example from the webpage. First load the 'autoreload' feature.

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

Then import the module you want to test:

In []: import foo
In []: foo.some_function()
Out[]: 42

Open foo.py in an editor and change some_function to return 43

In []: foo.some_function()
Out[]: 43

It also works if you import the function directly.

In []: from foo import some_function
In []: some_function()
Out[]: 42

Make change in some_function to return 43.

In []: some_function()
Out[]: 43
Ashfaq
  • 1,054
  • 8
  • 13
72

In addition to gnibbler's answer:

This changed in Python 3 to:

>>> import imp
>>> imp.reload(foo)

As @onnodb points out, imp is deprecated in favor of importlib since Python 3.4:

>>> import importlib
>>> importlib.reload(foo)
danlei
  • 14,121
  • 5
  • 58
  • 82
8

If you want this to happen automatically, there is the autoreload module that comes with iPython.

Seanny123
  • 8,776
  • 13
  • 68
  • 124
CpILL
  • 6,169
  • 5
  • 38
  • 37
2

In [15] instead of del foo, use

import sys
del sys.modules["foo"]

to delete foo from the module cache