annotate Lib/ni.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 544217d548a5
children 2656d1eea792
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2887
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 """New import scheme with package support.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
3617
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
3 Quick Reference
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
4 ---------------
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
5
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
6 - To enable package support, execute "import ni" before importing any
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
7 packages. Importing this module automatically installs the relevant
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
8 import hooks.
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
9
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
10 - To create a package named spam containing sub-modules ham, bacon and
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
11 eggs, create a directory spam somewhere on Python's module search
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
12 path (i.e. spam's parent directory must be one of the directories in
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
13 sys.path or $PYTHONPATH); then create files ham.py, bacon.py and
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
14 eggs.py inside spam.
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
15
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
16 - To import module ham from package spam and use function hamneggs()
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
17 from that module, you can either do
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
18
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
19 import spam.ham # *not* "import spam" !!!
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
20 spam.ham.hamneggs()
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
21
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
22 or
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
23
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
24 from spam import ham
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
25 ham.hamneggs()
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
26
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
27 or
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
28
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
29 from spam.ham import hamneggs
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
30 hamneggs()
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
31
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
32 - Importing just "spam" does not do what you expect: it creates an
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
33 empty package named spam if one does not already exist, but it does
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
34 not import spam's submodules. The only submodule that is guaranteed
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
35 to be imported is spam.__init__, if it exists. Note that
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
36 spam.__init__ is a submodule of package spam. It can reference to
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
37 spam's namespace via the '__.' prefix, for instance
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
38
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
39 __.spam_inited = 1 # Set a package-level variable
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
40
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
41
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
42
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
43 Theory of Operation
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
44 -------------------
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
45
2887
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 A Package is a module that can contain other modules. Packages can be
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 nested. Package introduce dotted names for modules, like P.Q.M, which
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 could correspond to a file P/Q/M.py found somewhere on sys.path. It
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 is possible to import a package itself, though this makes little sense
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 unless the package contains a module called __init__.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 A package has two variables that control the namespace used for
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 packages and modules, both initialized to sensible defaults the first
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 time the package is referenced.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 (1) A package's *module search path*, contained in the per-package
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 variable __path__, defines a list of *directories* where submodules or
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 subpackages of the package are searched. It is initialized to the
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 directory containing the package. Setting this variable to None makes
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 the module search path default to sys.path (this is not quite the same
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 as setting it to sys.path, since the latter won't track later
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 assignments to sys.path).
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 (2) A package's *import domain*, contained in the per-package variable
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 __domain__, defines a list of *packages* that are searched (using
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 their respective module search paths) to satisfy imports. It is
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 initialized to the list cosisting of the package itself, its parent
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 package, its parent's parent, and so on, ending with the root package
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 (the nameless package containing all top-level packages and modules,
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 whose module search path is None, implying sys.path).
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 The default domain implements a search algorithm called "expanding
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 search". An alternative search algorithm called "explicit search"
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 fixes the import search path to contain only the root package,
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 requiring the modules in the package to name all imported modules by
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 their full name. The convention of using '__' to refer to the current
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 package (both as a per-module variable and in module names) can be
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 used by packages using explicit search to refer to modules in the same
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 package; this combination is known as "explicit-relative search".
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 The PackageImporter and PackageLoader classes together implement the
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 following policies:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 - There is a root package, whose name is ''. It cannot be imported
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 directly but may be referenced, e.g. by using '__' from a top-level
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 module.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 - In each module or package, the variable '__' contains a reference to
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 the parent package; in the root package, '__' points to itself.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 - In the name for imported modules (e.g. M in "import M" or "from M
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 import ..."), a leading '__' refers to the current package (i.e.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 the package containing the current module); leading '__.__' and so
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 on refer to the current package's parent, and so on. The use of
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 '__' elsewhere in the module name is not supported.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 - Modules are searched using the "expanding search" algorithm by
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 virtue of the default value for __domain__.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 - If A.B.C is imported, A is searched using __domain__; then
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 subpackage B is searched in A using its __path__, and so on.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 - Built-in modules have priority: even if a file sys.py exists in a
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 package, "import sys" imports the built-in sys module.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 - The same holds for frozen modules, for better or for worse.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 - Submodules and subpackages are not automatically loaded when their
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 parent packages is loaded.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 - The construct "from package import *" is illegal. (It can still be
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 used to import names from a module.)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 - When "from package import module1, module2, ..." is used, those
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 modules are explicitly loaded.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 - When a package is loaded, if it has a submodule __init__, that
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 module is loaded. This is the place where required submodules can
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 be loaded, the __path__ variable extended, etc. The __init__ module
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 is loaded even if the package was loaded only in order to create a
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 stub for a sub-package: if "import P.Q.R" is the first reference to
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 P, and P has a submodule __init__, P.__init__ is loaded before P.Q
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 is even searched.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 Caveats:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 - It is possible to import a package that has no __init__ submodule;
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 this is not particularly useful but there may be useful applications
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 for it (e.g. to manipulate its search paths from the outside!).
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 - There are no special provisions for os.chdir(). If you plan to use
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 os.chdir() before you have imported all your modules, it is better
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 not to have relative pathnames in sys.path. (This could actually be
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 fixed by changing the implementation of path_join() in the hook to
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 absolutize paths.)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 - Packages and modules are introduced in sys.modules as soon as their
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 loading is started. When the loading is terminated by an exception,
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 the sys.modules entries remain around.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 - There are no special measures to support mutually recursive modules,
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 but it will work under the same conditions where it works in the
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 flat module space system.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 - Sometimes dummy entries (whose value is None) are entered in
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 sys.modules, to indicate that a particular module does not exist --
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 this is done to speed up the expanding search algorithm when a
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 module residing at a higher level is repeatedly imported (Python
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 promises that importing a previously imported module is cheap!)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 - Although dynamically loaded extensions are allowed inside packages,
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 the current implementation (hardcoded in the interpreter) of their
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 initialization may cause problems if an extension invokes the
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 interpreter during its initialization.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 - reload() may find another version of the module only if it occurs on
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 the package search path. Thus, it keeps the connection to the
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 package to which the module belongs, but may find a different file.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 XXX Need to have an explicit name for '', e.g. '__root__'.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 """
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 import imp
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 import string
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 import sys
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 import __builtin__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 import ihooks
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 from ihooks import ModuleLoader, ModuleImporter
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 class PackageLoader(ModuleLoader):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 """A subclass of ModuleLoader with package support.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 find_module_in_dir() will succeed if there's a subdirectory with
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 the given name; load_module() will create a stub for a package and
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 load its __init__ module if it exists.
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 """
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 def find_module_in_dir(self, name, dir):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 if dir is not None:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 dirname = self.hooks.path_join(dir, name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 if self.hooks.path_isdir(dirname):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 return None, dirname, ('', '', 'PACKAGE')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 return ModuleLoader.find_module_in_dir(self, name, dir)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 def load_module(self, name, stuff):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 file, filename, info = stuff
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 suff, mode, type = info
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 if type == 'PACKAGE':
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 return self.load_package(name, stuff)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 if sys.modules.has_key(name):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 m = sys.modules[name]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 sys.modules[name] = m = imp.new_module(name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 self.set_parent(m)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 if type == imp.C_EXTENSION and '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 return self.load_dynamic(name, stuff)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 return ModuleLoader.load_module(self, name, stuff)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 def load_dynamic(self, name, stuff):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 file, filename, (suff, mode, type) = stuff
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 # Hack around restriction in imp.load_dynamic()
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 i = string.rfind(name, '.')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 tail = name[i+1:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 if sys.modules.has_key(tail):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 save = sys.modules[tail]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 save = None
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 sys.modules[tail] = imp.new_module(name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 try:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 m = imp.load_dynamic(tail, filename, file)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 finally:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 if save:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 sys.modules[tail] = save
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 del sys.modules[tail]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 sys.modules[name] = m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 return m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 def load_package(self, name, stuff):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 file, filename, info = stuff
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 if sys.modules.has_key(name):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 package = sys.modules[name]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 sys.modules[name] = package = imp.new_module(name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 package.__path__ = [filename]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 self.init_package(package)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 return package
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 def init_package(self, package):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 self.set_parent(package)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 self.set_domain(package)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 self.call_init_module(package)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 def set_parent(self, m):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 name = m.__name__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 if '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 name = name[:string.rfind(name, '.')]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 name = ''
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 m.__ = sys.modules[name]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 def set_domain(self, package):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 name = package.__name__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 package.__domain__ = domain = [name]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 while '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 name = name[:string.rfind(name, '.')]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 domain.append(name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 if name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 domain.append('')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 def call_init_module(self, package):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 stuff = self.find_module('__init__', package.__path__)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 if stuff:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 m = self.load_module(package.__name__ + '.__init__', stuff)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 package.__init__ = m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 class PackageImporter(ModuleImporter):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 """Importer that understands packages and '__'."""
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 def __init__(self, loader = None, verbose = 0):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 ModuleImporter.__init__(self,
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 loader or PackageLoader(None, verbose), verbose)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 def import_module(self, name, globals={}, locals={}, fromlist=[]):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 if globals.has_key('__'):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 package = globals['__']
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 # No calling context, assume in root package
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 package = sys.modules['']
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 if name[:3] in ('__.', '__'):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 p = package
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 name = name[3:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 while name[:3] in ('__.', '__'):
4261
544217d548a5 Fix type in loop stripping '__.' from name
Guido van Rossum <guido@python.org>
parents: 3617
diff changeset
283 p = p.__
2887
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 name = name[3:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 if not name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 return self.finish(package, p, '', fromlist)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 if '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 i = string.find(name, '.')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 name, tail = name[:i], name[i:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 tail = ''
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 mname = p.__name__ and p.__name__+'.'+name or name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 m = self.get1(mname)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 return self.finish(package, m, tail, fromlist)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 if '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 i = string.find(name, '.')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 name, tail = name[:i], name[i:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 tail = ''
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 for pname in package.__domain__:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 mname = pname and pname+'.'+name or name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 m = self.get0(mname)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 if m: break
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 raise ImportError, "No such module %s" % name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 return self.finish(m, m, tail, fromlist)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 def finish(self, module, m, tail, fromlist):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 # Got ....A; now get ....A.B.C.D
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 yname = m.__name__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 if tail and sys.modules.has_key(yname + tail): # Fast path
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 yname, tail = yname + tail, ''
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 m = self.get1(yname)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 while tail:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 i = string.find(tail, '.', 1)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 if i > 0:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 head, tail = tail[:i], tail[i:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 head, tail = tail, ''
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 yname = yname + head
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 m = self.get1(yname)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 # Got ....A.B.C.D; now finalize things depending on fromlist
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 if not fromlist:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 return module
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 if '__' in fromlist:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 raise ImportError, "Can't import __ from anywhere"
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 if not hasattr(m, '__path__'): return m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 if '*' in fromlist:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 raise ImportError, "Can't import * from a package"
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 for f in fromlist:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 if hasattr(m, f): continue
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 fname = yname + '.' + f
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 self.get1(fname)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 return m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 def get1(self, name):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 m = self.get(name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 if not m:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 raise ImportError, "No module named %s" % name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 return m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 def get0(self, name):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 m = self.get(name)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 if not m:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 sys.modules[name] = None
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 return m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 def get(self, name):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 # Internal routine to get or load a module when its parent exists
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 if sys.modules.has_key(name):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 return sys.modules[name]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 if '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 i = string.rfind(name, '.')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 head, tail = name[:i], name[i+1:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 head, tail = '', name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 path = sys.modules[head].__path__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 stuff = self.loader.find_module(tail, path)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 if not stuff:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 return None
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 sys.modules[name] = m = self.loader.load_module(name, stuff)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 if head:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 setattr(sys.modules[head], tail, m)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 return m
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 def reload(self, module):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 name = module.__name__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 if '.' in name:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 i = string.rfind(name, '.')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 head, tail = name[:i], name[i+1:]
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 path = sys.modules[head].__path__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 else:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 tail = name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 path = sys.modules[''].__path__
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 stuff = self.loader.find_module(tail, path)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 if not stuff:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 raise ImportError, "No module named %s" % name
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 return self.loader.load_module(name, stuff)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 def unload(self, module):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 if hasattr(module, '__path__'):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 raise ImportError, "don't know how to unload packages yet"
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 PackageImporter.unload(self, module)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 def install(self):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 if not sys.modules.has_key(''):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 sys.modules[''] = package = imp.new_module('')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 package.__path__ = None
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 self.loader.init_package(package)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 for m in sys.modules.values():
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 if not m: continue
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 if not hasattr(m, '__'):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 self.loader.set_parent(m)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 ModuleImporter.install(self)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 def install(v = 0):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 ihooks.install(PackageImporter(None, v))
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 def uninstall():
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 ihooks.uninstall()
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 def ni(v = 0):
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 install(v)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 def no():
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 uninstall()
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 def test():
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 import pdb
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 try:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 testproper()
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 except:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 sys.last_type, sys.last_value, sys.last_traceback = (
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 sys.exc_type, sys.exc_value, sys.exc_traceback)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 print
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 print sys.last_type, ':', sys.last_value
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 print
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 pdb.pm()
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 def testproper():
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 install(1)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 try:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 import mactest
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 print dir(mactest)
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 raw_input('OK?')
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 finally:
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 uninstall()
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 if __name__ == '__main__':
ec0b42889243 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 test()
3617
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
434 else:
6e73584cf575 Auto-install on first import.
Guido van Rossum <guido@python.org>
parents: 2887
diff changeset
435 install()