1 """New import scheme with package support.
6 - To enable package support, execute "import ni" before importing any
7 packages. Importing this module automatically installs the relevant
10 - To create a package named spam containing sub-modules ham, bacon and
11 eggs, create a directory spam somewhere on Python's module search
12 path (i.e. spam's parent directory must be one of the directories in
13 sys.path or $PYTHONPATH); then create files ham.py, bacon.py and
16 - To import module ham from package spam and use function hamneggs()
17 from that module, you can either do
19 import spam.ham # *not* "import spam" !!!
29 from spam.ham import hamneggs
32 - Importing just "spam" does not do what you expect: it creates an
33 empty package named spam if one does not already exist, but it does
34 not import spam's submodules. The only submodule that is guaranteed
35 to be imported is spam.__init__, if it exists. Note that
36 spam.__init__ is a submodule of package spam. It can reference to
37 spam's namespace via the '__.' prefix, for instance
39 __.spam_inited = 1 # Set a package-level variable
46 A Package is a module that can contain other modules. Packages can be
47 nested. Package introduce dotted names for modules, like P.Q.M, which
48 could correspond to a file P/Q/M.py found somewhere on sys.path. It
49 is possible to import a package itself, though this makes little sense
50 unless the package contains a module called __init__.
52 A package has two variables that control the namespace used for
53 packages and modules, both initialized to sensible defaults the first
54 time the package is referenced.
56 (1) A package's *module search path*, contained in the per-package
57 variable __path__, defines a list of *directories* where submodules or
58 subpackages of the package are searched. It is initialized to the
59 directory containing the package. Setting this variable to None makes
60 the module search path default to sys.path (this is not quite the same
61 as setting it to sys.path, since the latter won't track later
62 assignments to sys.path).
64 (2) A package's *import domain*, contained in the per-package variable
65 __domain__, defines a list of *packages* that are searched (using
66 their respective module search paths) to satisfy imports. It is
67 initialized to the list cosisting of the package itself, its parent
68 package, its parent's parent, and so on, ending with the root package
69 (the nameless package containing all top-level packages and modules,
70 whose module search path is None, implying sys.path).
72 The default domain implements a search algorithm called "expanding
73 search". An alternative search algorithm called "explicit search"
74 fixes the import search path to contain only the root package,
75 requiring the modules in the package to name all imported modules by
76 their full name. The convention of using '__' to refer to the current
77 package (both as a per-module variable and in module names) can be
78 used by packages using explicit search to refer to modules in the same
79 package; this combination is known as "explicit-relative search".
81 The PackageImporter and PackageLoader classes together implement the
84 - There is a root package, whose name is ''. It cannot be imported
85 directly but may be referenced, e.g. by using '__' from a top-level
88 - In each module or package, the variable '__' contains a reference to
89 the parent package; in the root package, '__' points to itself.
91 - In the name for imported modules (e.g. M in "import M" or "from M
92 import ..."), a leading '__' refers to the current package (i.e.
93 the package containing the current module); leading '__.__' and so
94 on refer to the current package's parent, and so on. The use of
95 '__' elsewhere in the module name is not supported.
97 - Modules are searched using the "expanding search" algorithm by
98 virtue of the default value for __domain__.
100 - If A.B.C is imported, A is searched using __domain__; then
101 subpackage B is searched in A using its __path__, and so on.
103 - Built-in modules have priority: even if a file sys.py exists in a
104 package, "import sys" imports the built-in sys module.
106 - The same holds for frozen modules, for better or for worse.
108 - Submodules and subpackages are not automatically loaded when their
109 parent packages is loaded.
111 - The construct "from package import *" is illegal. (It can still be
112 used to import names from a module.)
114 - When "from package import module1, module2, ..." is used, those
115 modules are explicitly loaded.
117 - When a package is loaded, if it has a submodule __init__, that
118 module is loaded. This is the place where required submodules can
119 be loaded, the __path__ variable extended, etc. The __init__ module
120 is loaded even if the package was loaded only in order to create a
121 stub for a sub-package: if "import P.Q.R" is the first reference to
122 P, and P has a submodule __init__, P.__init__ is loaded before P.Q
127 - It is possible to import a package that has no __init__ submodule;
128 this is not particularly useful but there may be useful applications
129 for it (e.g. to manipulate its search paths from the outside!).
131 - There are no special provisions for os.chdir(). If you plan to use
132 os.chdir() before you have imported all your modules, it is better
133 not to have relative pathnames in sys.path. (This could actually be
134 fixed by changing the implementation of path_join() in the hook to
137 - Packages and modules are introduced in sys.modules as soon as their
138 loading is started. When the loading is terminated by an exception,
139 the sys.modules entries remain around.
141 - There are no special measures to support mutually recursive modules,
142 but it will work under the same conditions where it works in the
143 flat module space system.
145 - Sometimes dummy entries (whose value is None) are entered in
146 sys.modules, to indicate that a particular module does not exist --
147 this is done to speed up the expanding search algorithm when a
148 module residing at a higher level is repeatedly imported (Python
149 promises that importing a previously imported module is cheap!)
151 - Although dynamically loaded extensions are allowed inside packages,
152 the current implementation (hardcoded in the interpreter) of their
153 initialization may cause problems if an extension invokes the
154 interpreter during its initialization.
156 - reload() may find another version of the module only if it occurs on
157 the package search path. Thus, it keeps the connection to the
158 package to which the module belongs, but may find a different file.
160 XXX Need to have an explicit name for '', e.g. '__root__'.
171 from ihooks
import ModuleLoader
, ModuleImporter
174 class PackageLoader(ModuleLoader
):
176 """A subclass of ModuleLoader with package support.
178 find_module_in_dir() will succeed if there's a subdirectory with
179 the given name; load_module() will create a stub for a package and
180 load its __init__ module if it exists.
184 def find_module_in_dir(self
, name
, dir):
186 dirname
= self
.hooks
.path_join(dir, name
)
187 if self
.hooks
.path_isdir(dirname
):
188 return None, dirname
, ('', '', 'PACKAGE')
189 return ModuleLoader
.find_module_in_dir(self
, name
, dir)
191 def load_module(self
, name
, stuff
):
192 file, filename
, info
= stuff
193 suff
, mode
, type = info
194 if type == 'PACKAGE':
195 return self
.load_package(name
, stuff
)
196 if sys
.modules
.has_key(name
):
197 m
= sys
.modules
[name
]
199 sys
.modules
[name
] = m
= imp
.new_module(name
)
201 if type == imp
.C_EXTENSION
and '.' in name
:
202 return self
.load_dynamic(name
, stuff
)
204 return ModuleLoader
.load_module(self
, name
, stuff
)
206 def load_dynamic(self
, name
, stuff
):
207 file, filename
, (suff
, mode
, type) = stuff
208 # Hack around restriction in imp.load_dynamic()
209 i
= string
.rfind(name
, '.')
211 if sys
.modules
.has_key(tail
):
212 save
= sys
.modules
[tail
]
215 sys
.modules
[tail
] = imp
.new_module(name
)
217 m
= imp
.load_dynamic(tail
, filename
, file)
220 sys
.modules
[tail
] = save
222 del sys
.modules
[tail
]
223 sys
.modules
[name
] = m
226 def load_package(self
, name
, stuff
):
227 file, filename
, info
= stuff
228 if sys
.modules
.has_key(name
):
229 package
= sys
.modules
[name
]
231 sys
.modules
[name
] = package
= imp
.new_module(name
)
232 package
.__path
__ = [filename
]
233 self
.init_package(package
)
236 def init_package(self
, package
):
237 self
.set_parent(package
)
238 self
.set_domain(package
)
239 self
.call_init_module(package
)
241 def set_parent(self
, m
):
244 name
= name
[:string
.rfind(name
, '.')]
247 m
.__ = sys
.modules
[name
]
249 def set_domain(self
, package
):
250 name
= package
.__name
__
251 package
.__domain
__ = domain
= [name
]
253 name
= name
[:string
.rfind(name
, '.')]
258 def call_init_module(self
, package
):
259 stuff
= self
.find_module('__init__', package
.__path
__)
261 m
= self
.load_module(package
.__name
__ + '.__init__', stuff
)
265 class PackageImporter(ModuleImporter
):
267 """Importer that understands packages and '__'."""
269 def __init__(self
, loader
= None, verbose
= 0):
270 ModuleImporter
.__init
__(self
,
271 loader
or PackageLoader(None, verbose
), verbose
)
273 def import_module(self
, name
, globals={}, locals={}, fromlist
=[]):
274 if globals.has_key('__'):
275 package
= globals['__']
277 # No calling context, assume in root package
278 package
= sys
.modules
['']
279 if name
[:3] in ('__.', '__'):
282 while name
[:3] in ('__.', '__'):
286 return self
.finish(package
, p
, '', fromlist
)
288 i
= string
.find(name
, '.')
289 name
, tail
= name
[:i
], name
[i
:]
292 mname
= p
.__name
__ and p
.__name
__+'.'+name
or name
294 return self
.finish(package
, m
, tail
, fromlist
)
296 i
= string
.find(name
, '.')
297 name
, tail
= name
[:i
], name
[i
:]
300 for pname
in package
.__domain
__:
301 mname
= pname
and pname
+'.'+name
or name
305 raise ImportError, "No such module %s" % name
306 return self
.finish(m
, m
, tail
, fromlist
)
308 def finish(self
, module
, m
, tail
, fromlist
):
309 # Got ....A; now get ....A.B.C.D
311 if tail
and sys
.modules
.has_key(yname
+ tail
): # Fast path
312 yname
, tail
= yname
+ tail
, ''
315 i
= string
.find(tail
, '.', 1)
317 head
, tail
= tail
[:i
], tail
[i
:]
319 head
, tail
= tail
, ''
323 # Got ....A.B.C.D; now finalize things depending on fromlist
327 raise ImportError, "Can't import __ from anywhere"
328 if not hasattr(m
, '__path__'): return m
330 raise ImportError, "Can't import * from a package"
332 if hasattr(m
, f
): continue
333 fname
= yname
+ '.' + f
337 def get1(self
, name
):
340 raise ImportError, "No module named %s" % name
343 def get0(self
, name
):
346 sys
.modules
[name
] = None
350 # Internal routine to get or load a module when its parent exists
351 if sys
.modules
.has_key(name
):
352 return sys
.modules
[name
]
354 i
= string
.rfind(name
, '.')
355 head
, tail
= name
[:i
], name
[i
+1:]
357 head
, tail
= '', name
358 path
= sys
.modules
[head
].__path
__
359 stuff
= self
.loader
.find_module(tail
, path
)
362 sys
.modules
[name
] = m
= self
.loader
.load_module(name
, stuff
)
364 setattr(sys
.modules
[head
], tail
, m
)
367 def reload(self
, module
):
368 name
= module
.__name
__
370 i
= string
.rfind(name
, '.')
371 head
, tail
= name
[:i
], name
[i
+1:]
372 path
= sys
.modules
[head
].__path
__
375 path
= sys
.modules
[''].__path
__
376 stuff
= self
.loader
.find_module(tail
, path
)
378 raise ImportError, "No module named %s" % name
379 return self
.loader
.load_module(name
, stuff
)
381 def unload(self
, module
):
382 if hasattr(module
, '__path__'):
383 raise ImportError, "don't know how to unload packages yet"
384 PackageImporter
.unload(self
, module
)
387 if not sys
.modules
.has_key(''):
388 sys
.modules
[''] = package
= imp
.new_module('')
389 package
.__path
__ = None
390 self
.loader
.init_package(package
)
391 for m
in sys
.modules
.values():
393 if not hasattr(m
, '__'):
394 self
.loader
.set_parent(m
)
395 ModuleImporter
.install(self
)
399 ihooks
.install(PackageImporter(None, v
))
415 sys
.last_type
, sys
.last_value
, sys
.last_traceback
= (
416 sys
.exc_type
, sys
.exc_value
, sys
.exc_traceback
)
418 print sys
.last_type
, ':', sys
.last_value
432 if __name__
== '__main__':