Python Module Reloader
This library implements a dependency-based module reloader for Python. Unlike the builtin reload() function, this reloader will reload the requested module and all other modules that are dependent on that module.
A detailed discussion of the reloader's implementation is available here:
The reloader works by tracking dependencies between imported modules. It must first be enabled in order to track those dependencies. The reloader has no dependency information for modules that were imported before it was enabled or after it is disabled, so you'll probably want to enable the reloader early in your application's startup process.
import reloader reloader.enable() # Import additional modules import module1 import module2
To manually reload an imported module, pass it to the reloader's
import example reloader.reload(example)
Note that you must pass the module object itself and not a string containing
the module's name. If you only have the module's name, you can fetch the
module object from the global
You can also query a module's dependencies for informational or debugging purposes:
You can disable the reloader's dependency tracking at any time:
There may be times when you don't want a module and its dependency hierarchy
to be reloaded. The module might rarely change and be expensive to import.
To support these cases, you can explicitly "blacklist" modules from the
reloading process using the
blacklist argument to
The blacklist can be any iterable listing the fully-qualified names of modules that should be ignored. Note that blacklisted modules will still appear in the dependency graph for completeness; they will just not be reloaded.
An Interactive Example
This example demonstrates how easily the reloader can be used from the
interactive Python interpretter. Imagine you have the module
open in a text editor, and it contains the following:
print "I am example.py"
Our interactive session starts like this:
>>> import reloader >>> reloader.enable() >>> import example I am example.py
example.py in your text editor. You can then reload the
example in your interactive session:
>>> reloader.reload(example) I am the modified example.py
This is a simplistic example that doesn't fully demonstrate the power of the reloader's dependency-based module tracking, but it hopefully illustrates the basic usage and utility of the system.
The __reload__() Callback
If a module has a
__reload__() function, it will be called with a copy of
the original module's dictionary after it has been reloaded. This provides a
convenient mechanism for preserving state between reloads.
Consider a module named
counts that contains the following code:
COUNTER = 0
COUNTER variable will be reset to 0 when the module is
>>> import counts >>> counts.COUNTER += 1 >>> counts.COUNTER 1 >>> reloader.reload(counts) >>> counts.COUNTER += 1 1
We can preserve the value of
COUNTER across reloads by adding a
__reload__() function to the
def __reload__(state): global COUNTER COUNTER = state['COUNTER']
Now when we reload
>>> import counts >>> counts.COUNTER += 1 >>> counts.COUNTER 1 >>> reloader.reload(counts) >>> counts.COUNTER += 1 >>> counts.COUNTER 2