1 """An Python re-implementation of hierarchical module import.
3 This code is intended to be read, not executed. However, it does work
4 -- all you need to do to enable it is "import knee".
6 (The name is a pun on the klunkier predecessor of this module, "ni".)
10 import sys, imp, __builtin__
14 def import_hook(name, globals=None, locals=None, fromlist=None):
20 if hasattr(m,
"__path__"):
25 if not globals
or not globals.has_key(
"__name__"):
27 pname = globals[
'__name__']
28 if globals.has_key(
"__path__"):
29 parent = sys.modules[pname]
30 assert globals
is parent.__dict__
35 parent = sys.modules[pname]
36 assert parent.__name__ == pname
49 qname =
"%s.%s" % (parent.__name__, head)
59 raise ImportError,
"No module named " + qname
65 if i < 0: i = len(tail)
66 head, tail = tail[:i], tail[i+1:]
67 mname =
"%s.%s" % (m.__name__, head)
70 raise ImportError,
"No module named " + mname
79 except AttributeError:
84 if sub !=
"*" and not hasattr(m, sub):
85 subname =
"%s.%s" % (m.__name__, sub)
88 raise ImportError,
"No module named " + subname
92 return sys.modules[fqname]
96 fp, pathname, stuff = imp.find_module(partname,
97 parent
and parent.__path__)
101 m = imp.load_module(fqname, fp, pathname, stuff)
105 setattr(parent, partname, m)
111 name = module.__name__
116 parent = sys.modules[pname]
121 original_import = __builtin__.__import__
122 original_reload = __builtin__.reload
125 __builtin__.__import__ = import_hook
126 __builtin__.reload = reload_hook