how to "reimport" module to python then code be changed after import
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?
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)
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
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)
If you want this to happen automatically, there is the autoreload module that comes with iPython.
In [15] instead of del foo
, use
import sys
del sys.modules["foo"]
to delete foo from the module cache
精彩评论