reload (update) a module file in the interpreter
Asked Answered
A

3

13

Let's say I have this python script script.py and I load it in the interpreter by typing

import script

and then I execute my function by typing:

script.testFunction(testArgument)

OK so far so good, but when I change script.py, if I try to import again the script doesn't update. I have to exit from the interpreter, restart the interpreter, and then import the new version of the script for it to work.

What should I do instead?

Argumentative answered 19/9, 2010 at 22:10 Comment(2)
Question: hhhhmmm, how would I reload this module named 'script'? Answer: reload(script). +1 for Python!Haddad
BTW I love somebody edited my original question !!! LoL!!Argumentative
S
11

You can issue a reload script, but that will not update your existing objects and will not go deep inside other modules.

Fortunately this is solved by IPython - a better python shell which supports auto-reloading.

To use autoreloading in IPython, you'll have to type import ipy_autoreload first, or put it permanently in your ~/.ipython/ipy_user_conf.py.

Then run:

%autoreload 1
%aimport script

%autoreload 1 means that every module loaded with %aimport will be reloaded before executing code from the prompt. This will not update any existing objects, however.

See http://ipython.org/ipython-doc/dev/config/extensions/autoreload.html for more fun things you can do.

Stagecoach answered 19/9, 2010 at 22:15 Comment(1)
You can also do %load_ext autoreload ipython.org/ipython-doc/dev/config/extensions/autoreload.htmlHsiuhsu
N
7

http://docs.python.org/library/functions.html#reload

reload(module)

Reload a previously imported module. The argument must be a module object, so it must have been successfully imported before. This is useful if you have edited the module source file using an external editor and want to try out the new version without leaving the Python interpreter. The return value is the module object (the same as the module argument).

Neural answered 19/9, 2010 at 22:12 Comment(1)
Aye, it does need a sarcasm font. My thanks were sincere.Neural
A
1

An alternative solution that has helped me greatly is to maintain a copy of sys.modules keys and pop the new modules after the import to force re-imports of deep imports:

>>> oldmods = set(sys.modules.keys())
>>> import script
>>> # Do stuff
>>> for mod in set(sys.modules.keys()).difference(oldmods): sys.modules.pop(mod)
>>> import script
Attribution answered 10/1, 2012 at 15:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.