[IPython-dev] replacement for deep_reload.py

Ralf Schmitt ralf at brainbot.com
Wed Oct 1 14:21:57 EDT 2003


Hi,
I've just hacked my own version of deep_reload.py.
It works by replacing sys.modules with an empty hash and installing
it's __builtin__.__import__, which just calls __builtin__.reload and the old
__builtin__.__import__.
The only problem I've discovered so far, is that dreload(os)
doesn't work (dreload(some module which imports os) however does work).
I've tested it with python 2.3.1 and IPython from cvs.
The code is very simple, so maybe you can save yourself some headache :)
I'll use that version in the next few days, and will report on other 
problems I found..
- Ralf





import sys
import __builtin__


# Save the original hooks
builtin_import = None
old_modules = {}
reloaded = {}

def my_import_hook(name, globals=None, locals=None, fromlist=None):
    global reloaded
   
##     if fromlist:
##         print 'Importing', fromlist, 'from module', name
##     else:
##         print 'Importing module', name

    if old_modules.has_key(name) and not reloaded.has_key(name):
        reloaded[name]=1
        print "Reloading", name
        __builtin__.reload(old_modules[name])
       
    return builtin_import(name, globals, locals, fromlist)


# Replacement for reload()
def reload(module, exclude=['sys', '__builtin__', '__main__']):
    """Recursively reload all modules used in the given module.  Optionally
    takes a list of modules to exclude from reloading.  The default exclude
    list contains sys, __main__, and __builtin__, to prevent, e.g., 
resetting
    display, exception, and io hooks.
    """
    global builtin_import
    global old_modules
    global reloaded

    reloaded = {}
    old_modules = sys.modules
    sys.modules = {}
    for ex in exclude+list(sys.builtin_module_names):
        if old_modules.has_key(ex):
            sys.modules[ex] = old_modules[ex]
            reloaded[ex]=1

    builtin_import = __builtin__.__import__
    __builtin__.__import__ = my_import_hook
    try:
        return __builtin__.reload(module)
    finally:
        __builtin__.__import__ = builtin_import
        for m in old_modules:
            if not sys.modules.has_key(m):
                #print "RESTORING module", m
                sys.modules[m] = old_modules[m]
            else:
                #print "NOT RESTORING", m
                pass




More information about the IPython-dev mailing list