blob: 47f65cb4cd05a929f78143a8a184a4f0e0666326 [file] [log] [blame]
Guido van Rossum501d0bb1997-09-09 20:35:20 +00001# More structured (slower) alternative to mini
2
3import sys, imp, __builtin__, string
4
5
6# Replacement for __import__()
7def import_hook(name, globals=None, locals=None, fromlist=None):
8 parent = determine_parent(globals)
9 q, tail = find_head_package(parent, name)
10 m = load_tail(q, tail)
11 if not fromlist:
12 return q
13 if hasattr(m, "__path__"):
14 ensure_fromlist(m, fromlist)
15 return m
16
17def determine_parent(globals):
18 if not globals or not globals.has_key("__name__"):
19 return None
20 pname = globals['__name__']
21 if globals.has_key("__path__"):
22 parent = sys.modules[pname]
23 assert globals is parent.__dict__
24 return parent
25 if '.' in pname:
26 i = string.rfind(pname, '.')
27 pname = pname[:i]
28 parent = sys.modules[pname]
29 assert parent.__name__ == pname
30 return parent
31 return None
32
33def find_head_package(parent, name):
34 if '.' in name:
35 i = string.find(name, '.')
36 head = name[:i]
37 tail = name[i+1:]
38 else:
39 head = name
40 tail = ""
41 if parent:
42 qname = "%s.%s" % (parent.__name__, head)
43 else:
44 qname = head
45 q = import_module(head, qname, parent)
46 if q: return q, tail
47 if parent:
48 qname = head
49 parent = None
50 q = import_module(head, qname, parent)
51 if q: return q, tail
52 raise ImportError, "No module named " + qname
53
54def load_tail(q, tail):
55 m = q
56 while tail:
57 i = string.find(tail, '.')
58 if i < 0: i = len(tail)
59 head, tail = tail[:i], tail[i+1:]
60 mname = "%s.%s" % (m.__name__, head)
61 m = import_module(head, mname, m)
62 if not m:
63 raise ImportError, "No module named " + mname
64 return m
65
66def ensure_fromlist(m, fromlist):
67 for sub in fromlist:
68 if sub != "*" and not hasattr(m, sub):
69 subname = "%s.%s" % (m.__name__, sub)
70 submod = import_module(sub, subname, m)
71## if not submod:
72## raise ImportError, "No module named " + subname
73
74def import_module(partname, fqname, parent):
75 try:
76 return sys.modules[fqname]
77 except KeyError:
78 pass
79 try:
80 fp, pathname, stuff = imp.find_module(partname,
81 parent and parent.__path__)
82 except ImportError:
83 return None
84 try:
85 m = imp.load_module(fqname, fp, pathname, stuff)
86 finally:
87 if fp: fp.close()
88 if parent:
89 setattr(parent, partname, m)
90 return m
91
92
93# Replacement for reload()
94def reload_hook(module):
95 name = module.__name__
96 if '.' not in name:
97 return import_module(name, name, None)
98 i = string.rfind(name, '.')
99 pname = name[:i]
100 parent = sys.modules[pname]
101 return import_module(name[i+1:], name, parent)
102
103
104# Save the original hooks
105original_import = __builtin__.__import__
106original_reload = __builtin__.reload
107
108# Now install our hooks
109__builtin__.__import__ = import_hook
110__builtin__.reload = reload_hook
111
112# pretend we're ni, too
113sys.modules['ni'] = sys.modules[__name__]
114def ni(): pass
115def install(): pass