Mercurial > cpython-lru_cache-weakref
annotate Lib/pkgutil.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 07229c6104b1 |
| children |
| rev | line source |
|---|---|
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 """Utilities to support packages.""" |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
84039
dfcb64f51f7b
Add reference implementation for PEP 443
Łukasz Langa <lukasz@langa.pl>
parents:
83367
diff
changeset
|
3 from functools import singledispatch as simplegeneric |
|
dfcb64f51f7b
Add reference implementation for PEP 443
Łukasz Langa <lukasz@langa.pl>
parents:
83367
diff
changeset
|
4 import importlib |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
5 import importlib.util |
|
86657
0c0cbba64b7b
Close #19409: add missing import in pkgutil
Nick Coghlan <ncoghlan@gmail.com>
parents:
84167
diff
changeset
|
6 import importlib.machinery |
|
84039
dfcb64f51f7b
Add reference implementation for PEP 443
Łukasz Langa <lukasz@langa.pl>
parents:
83367
diff
changeset
|
7 import os |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
8 import os.path |
|
84039
dfcb64f51f7b
Add reference implementation for PEP 443
Łukasz Langa <lukasz@langa.pl>
parents:
83367
diff
changeset
|
9 import sys |
|
dfcb64f51f7b
Add reference implementation for PEP 443
Łukasz Langa <lukasz@langa.pl>
parents:
83367
diff
changeset
|
10 from types import ModuleType |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
11 import warnings |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
12 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
13 __all__ = [ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
14 'get_importer', 'iter_importers', 'get_loader', 'find_loader', |
|
70406
2ee64c205d37
Add missing name in pkgutil.__all__
Éric Araujo <merwok@netwok.org>
parents:
55602
diff
changeset
|
15 'walk_packages', 'iter_modules', 'get_data', |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
16 'ImpImporter', 'ImpLoader', 'read_code', 'extend_path', |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
17 ] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
18 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
19 def read_code(stream): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
20 # This helper is needed in order for the PEP 302 emulation to |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
21 # correctly handle compiled files |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
22 import marshal |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
23 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
24 magic = stream.read(4) |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
25 if magic != importlib.util.MAGIC_NUMBER: |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
26 return None |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
27 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
72775
diff
changeset
|
28 stream.read(8) # Skip timestamp and size |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
29 return marshal.load(stream) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
30 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
31 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
32 def walk_packages(path=None, prefix='', onerror=None): |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
33 """Yields (module_loader, name, ispkg) for all modules recursively |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
34 on path, or, if path is None, all accessible modules. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
35 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
36 'path' should be either None or a list of paths to look for |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
37 modules in. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
38 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
39 'prefix' is a string to output on the front of every module name |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
40 on output. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
41 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
42 Note that this function must import all *packages* (NOT all |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
43 modules!) on the given path, in order to access the __path__ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
44 attribute to find submodules. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
45 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
46 'onerror' is a function which gets called with one argument (the |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
47 name of the package which was being imported) if any exception |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
48 occurs while trying to import a package. If no onerror function is |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
49 supplied, ImportErrors are caught and ignored, while all other |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
50 exceptions are propagated, terminating the search. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
51 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
52 Examples: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
53 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
54 # list all modules python can access |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
55 walk_packages() |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
56 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
57 # list all submodules of ctypes |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
58 walk_packages(ctypes.__path__, ctypes.__name__+'.') |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
59 """ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
60 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
61 def seen(p, m={}): |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
62 if p in m: |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
63 return True |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
64 m[p] = True |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
65 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
66 for importer, name, ispkg in iter_modules(path, prefix): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
67 yield importer, name, ispkg |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
68 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
69 if ispkg: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
70 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
71 __import__(name) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
72 except ImportError: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
73 if onerror is not None: |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
74 onerror(name) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
75 except Exception: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
76 if onerror is not None: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
77 onerror(name) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
78 else: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
79 raise |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
80 else: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
81 path = getattr(sys.modules[name], '__path__', None) or [] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
82 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
83 # don't traverse path items we've seen before |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
84 path = [p for p in path if not seen(p)] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
85 |
| 79378 | 86 yield from walk_packages(path, name+'.', onerror) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
87 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
88 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
89 def iter_modules(path=None, prefix=''): |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
90 """Yields (module_loader, name, ispkg) for all submodules on path, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
91 or, if path is None, all top-level modules on sys.path. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
92 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
93 'path' should be either None or a list of paths to look for |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
94 modules in. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
95 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
96 'prefix' is a string to output on the front of every module name |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
97 on output. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
98 """ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
99 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
100 if path is None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
101 importers = iter_importers() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
102 else: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
103 importers = map(get_importer, path) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
104 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
105 yielded = {} |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
106 for i in importers: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
107 for name, ispkg in iter_importer_modules(i, prefix): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
108 if name not in yielded: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
109 yielded[name] = 1 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
110 yield i, name, ispkg |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
111 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
112 |
|
84039
dfcb64f51f7b
Add reference implementation for PEP 443
Łukasz Langa <lukasz@langa.pl>
parents:
83367
diff
changeset
|
113 @simplegeneric |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
114 def iter_importer_modules(importer, prefix=''): |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
115 if not hasattr(importer, 'iter_modules'): |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
116 return [] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
117 return importer.iter_modules(prefix) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
118 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
119 |
|
78111
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
120 # Implement a file walker for the normal importlib path hook |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
121 def _iter_file_finder_modules(importer, prefix=''): |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
122 if importer.path is None or not os.path.isdir(importer.path): |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
123 return |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
124 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
125 yielded = {} |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
126 import inspect |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
127 try: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
128 filenames = os.listdir(importer.path) |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
129 except OSError: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
130 # ignore unreadable directories like import does |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
131 filenames = [] |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
132 filenames.sort() # handle packages before same-named modules |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
133 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
134 for fn in filenames: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
135 modname = inspect.getmodulename(fn) |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
136 if modname=='__init__' or modname in yielded: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
137 continue |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
138 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
139 path = os.path.join(importer.path, fn) |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
140 ispkg = False |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
141 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
142 if not modname and os.path.isdir(path) and '.' not in fn: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
143 modname = fn |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
144 try: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
145 dircontents = os.listdir(path) |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
146 except OSError: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
147 # ignore unreadable directories like import does |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
148 dircontents = [] |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
149 for fn in dircontents: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
150 subname = inspect.getmodulename(fn) |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
151 if subname=='__init__': |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
152 ispkg = True |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
153 break |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
154 else: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
155 continue # not a package |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
156 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
157 if modname and '.' not in modname: |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
158 yielded[modname] = 1 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
159 yield prefix + modname, ispkg |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
160 |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
161 iter_importer_modules.register( |
|
9101eab6178c
Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78107
diff
changeset
|
162 importlib.machinery.FileFinder, _iter_file_finder_modules) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
163 |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
164 |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
165 def _import_imp(): |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
166 global imp |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
167 with warnings.catch_warnings(): |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
168 warnings.simplefilter('ignore', PendingDeprecationWarning) |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
169 imp = importlib.import_module('imp') |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
170 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
171 class ImpImporter: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
172 """PEP 302 Importer that wraps Python's "classic" import algorithm |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
173 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
174 ImpImporter(dirname) produces a PEP 302 importer that searches that |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
175 directory. ImpImporter(None) produces a PEP 302 importer that searches |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
176 the current sys.path, plus any modules that are frozen or built-in. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
177 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
178 Note that ImpImporter does not currently support being used by placement |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
179 on sys.meta_path. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
180 """ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
181 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
182 def __init__(self, path=None): |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
183 global imp |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
184 warnings.warn("This emulation is deprecated, use 'importlib' instead", |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
185 DeprecationWarning) |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
186 _import_imp() |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
187 self.path = path |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
188 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
189 def find_module(self, fullname, path=None): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
190 # Note: we ignore 'path' argument since it is only used via meta_path |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
191 subname = fullname.split(".")[-1] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
192 if subname != fullname and self.path is None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
193 return None |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
194 if self.path is None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
195 path = None |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
196 else: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
197 path = [os.path.realpath(self.path)] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
198 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
199 file, filename, etc = imp.find_module(subname, path) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
200 except ImportError: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
201 return None |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
202 return ImpLoader(fullname, file, filename, etc) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
203 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
204 def iter_modules(self, prefix=''): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
205 if self.path is None or not os.path.isdir(self.path): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
206 return |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
207 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
208 yielded = {} |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
209 import inspect |
|
72774
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
210 try: |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
211 filenames = os.listdir(self.path) |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
212 except OSError: |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
213 # ignore unreadable directories like import does |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
214 filenames = [] |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
215 filenames.sort() # handle packages before same-named modules |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
216 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
217 for fn in filenames: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
218 modname = inspect.getmodulename(fn) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
219 if modname=='__init__' or modname in yielded: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
220 continue |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
221 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
222 path = os.path.join(self.path, fn) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
223 ispkg = False |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
224 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
225 if not modname and os.path.isdir(path) and '.' not in fn: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
226 modname = fn |
|
72774
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
227 try: |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
228 dircontents = os.listdir(path) |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
229 except OSError: |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
230 # ignore unreadable directories like import does |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
231 dircontents = [] |
|
77bac85f610a
Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents:
70410
diff
changeset
|
232 for fn in dircontents: |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
233 subname = inspect.getmodulename(fn) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
234 if subname=='__init__': |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
235 ispkg = True |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
236 break |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
237 else: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
238 continue # not a package |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
239 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
240 if modname and '.' not in modname: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
241 yielded[modname] = 1 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
242 yield prefix + modname, ispkg |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
243 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
244 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
245 class ImpLoader: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
246 """PEP 302 Loader that wraps Python's "classic" import algorithm |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
247 """ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
248 code = source = None |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
249 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
250 def __init__(self, fullname, file, filename, etc): |
|
84167
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
251 warnings.warn("This emulation is deprecated, use 'importlib' instead", |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
252 DeprecationWarning) |
|
1b8f08c4efd5
Issue #17177: The imp module is pending deprecation.
Brett Cannon <brett@python.org>
parents:
84039
diff
changeset
|
253 _import_imp() |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
254 self.file = file |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
255 self.filename = filename |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
256 self.fullname = fullname |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
257 self.etc = etc |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
258 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
259 def load_module(self, fullname): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
260 self._reopen() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
261 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
262 mod = imp.load_module(fullname, self.file, self.filename, self.etc) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
263 finally: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
264 if self.file: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
265 self.file.close() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
266 # Note: we don't set __loader__ because we want the module to look |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
267 # normal; i.e. this is just a wrapper for standard import machinery |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
268 return mod |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
269 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
270 def get_data(self, pathname): |
|
65730
d161714e7c92
Have pkgutil properly close files.
Brett Cannon <bcannon@gmail.com>
parents:
55602
diff
changeset
|
271 with open(pathname, "rb") as file: |
|
d161714e7c92
Have pkgutil properly close files.
Brett Cannon <bcannon@gmail.com>
parents:
55602
diff
changeset
|
272 return file.read() |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
273 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
274 def _reopen(self): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
275 if self.file and self.file.closed: |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
276 mod_type = self.etc[2] |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
277 if mod_type==imp.PY_SOURCE: |
|
69823
be5b8d1ded34
Replace open(filename, 'rU') by open(filename, 'r')
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65730
diff
changeset
|
278 self.file = open(self.filename, 'r') |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
279 elif mod_type in (imp.PY_COMPILED, imp.C_EXTENSION): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
280 self.file = open(self.filename, 'rb') |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
281 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
282 def _fix_name(self, fullname): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
283 if fullname is None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
284 fullname = self.fullname |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
285 elif fullname != self.fullname: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
286 raise ImportError("Loader for module %s cannot handle " |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
287 "module %s" % (self.fullname, fullname)) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
288 return fullname |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
289 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
290 def is_package(self, fullname): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
291 fullname = self._fix_name(fullname) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
292 return self.etc[2]==imp.PKG_DIRECTORY |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
293 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
294 def get_code(self, fullname=None): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
295 fullname = self._fix_name(fullname) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
296 if self.code is None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
297 mod_type = self.etc[2] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
298 if mod_type==imp.PY_SOURCE: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
299 source = self.get_source(fullname) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
300 self.code = compile(source, self.filename, 'exec') |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
301 elif mod_type==imp.PY_COMPILED: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
302 self._reopen() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
303 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
304 self.code = read_code(self.file) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
305 finally: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
306 self.file.close() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
307 elif mod_type==imp.PKG_DIRECTORY: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
308 self.code = self._get_delegate().get_code() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
309 return self.code |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
310 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
311 def get_source(self, fullname=None): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
312 fullname = self._fix_name(fullname) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
313 if self.source is None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
314 mod_type = self.etc[2] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
315 if mod_type==imp.PY_SOURCE: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
316 self._reopen() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
317 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
318 self.source = self.file.read() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
319 finally: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
320 self.file.close() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
321 elif mod_type==imp.PY_COMPILED: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
322 if os.path.exists(self.filename[:-1]): |
|
82168
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
323 with open(self.filename[:-1], 'r') as f: |
|
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
324 self.source = f.read() |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
325 elif mod_type==imp.PKG_DIRECTORY: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
326 self.source = self._get_delegate().get_source() |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
327 return self.source |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
328 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
329 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
330 def _get_delegate(self): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
331 return ImpImporter(self.filename).find_module('__init__') |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
332 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
333 def get_filename(self, fullname=None): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
334 fullname = self._fix_name(fullname) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
335 mod_type = self.etc[2] |
|
72402
f18e9db83483
Use a local name (it was intended to be used but overlooked).
Éric Araujo <merwok@netwok.org>
parents:
70413
diff
changeset
|
336 if mod_type==imp.PKG_DIRECTORY: |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
337 return self._get_delegate().get_filename() |
|
72402
f18e9db83483
Use a local name (it was intended to be used but overlooked).
Éric Araujo <merwok@netwok.org>
parents:
70413
diff
changeset
|
338 elif mod_type in (imp.PY_SOURCE, imp.PY_COMPILED, imp.C_EXTENSION): |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
339 return self.filename |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
340 return None |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
341 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
342 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
343 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
344 import zipimport |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
345 from zipimport import zipimporter |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
346 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
347 def iter_zipimport_modules(importer, prefix=''): |
|
55602
680ad8eed33b
Merged revisions 73833,73838,73850-73852,73856-73857 via svnmerge from
Georg Brandl <georg@python.org>
parents:
51657
diff
changeset
|
348 dirlist = sorted(zipimport._zip_directory_cache[importer.archive]) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
349 _prefix = importer.prefix |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
350 plen = len(_prefix) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
351 yielded = {} |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
352 import inspect |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
353 for fn in dirlist: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
354 if not fn.startswith(_prefix): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
355 continue |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
356 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
357 fn = fn[plen:].split(os.sep) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
358 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
359 if len(fn)==2 and fn[1].startswith('__init__.py'): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
360 if fn[0] not in yielded: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
361 yielded[fn[0]] = 1 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
362 yield fn[0], True |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
363 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
364 if len(fn)!=1: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
365 continue |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
366 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
367 modname = inspect.getmodulename(fn[0]) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
368 if modname=='__init__': |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
369 continue |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
370 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
371 if modname and '.' not in modname and modname not in yielded: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
372 yielded[modname] = 1 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
373 yield prefix + modname, False |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
374 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
375 iter_importer_modules.register(zipimporter, iter_zipimport_modules) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
376 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
377 except ImportError: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
378 pass |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
379 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
380 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
381 def get_importer(path_item): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
382 """Retrieve a PEP 302 importer for the given path item |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
383 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
384 The returned importer is cached in sys.path_importer_cache |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
385 if it was newly created by a path hook. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
386 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
387 The cache (or part of it) can be cleared manually if a |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
388 rescan of sys.path_hooks is necessary. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
389 """ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
390 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
391 importer = sys.path_importer_cache[path_item] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
392 except KeyError: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
393 for path_hook in sys.path_hooks: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
394 try: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
395 importer = path_hook(path_item) |
|
76566
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
396 sys.path_importer_cache.setdefault(path_item, importer) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
397 break |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
398 except ImportError: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
399 pass |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
400 else: |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
401 importer = None |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
402 return importer |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
403 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
404 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
405 def iter_importers(fullname=""): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
406 """Yield PEP 302 importers for the given module name |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
407 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
408 If fullname contains a '.', the importers will be for the package |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
409 containing fullname, otherwise they will be all registered top level |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
410 importers (i.e. those on both sys.meta_path and sys.path_hooks). |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
411 |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
412 If the named module is in a package, that package is imported as a side |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
413 effect of invoking this function. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
414 |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
415 If no module name is specified, all top level importers are produced. |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
416 """ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
417 if fullname.startswith('.'): |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
418 msg = "Relative module name {!r} not supported".format(fullname) |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
419 raise ImportError(msg) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
420 if '.' in fullname: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
421 # Get the containing package's __path__ |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
422 pkg_name = fullname.rpartition(".")[0] |
|
83366
c40b50d65a00
Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents:
80950
diff
changeset
|
423 pkg = importlib.import_module(pkg_name) |
|
c40b50d65a00
Close issue #16163: handle submodules in pkgutil.iter_importers
Nick Coghlan <ncoghlan@gmail.com>
parents:
80950
diff
changeset
|
424 path = getattr(pkg, '__path__', None) |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
425 if path is None: |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
426 return |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
427 else: |
|
79583
70d49694786c
Issue #16120: Use |yield from| in stdlib.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
79378
diff
changeset
|
428 yield from sys.meta_path |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
429 path = sys.path |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
430 for item in path: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
431 yield get_importer(item) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
432 |
|
87347
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
433 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
434 def get_loader(module_or_name): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
435 """Get a PEP 302 "loader" object for module_or_name |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
436 |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
437 Returns None if the module cannot be found or imported. |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
438 If the named module is not already imported, its containing package |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
439 (if any) is imported, in order to establish the package __path__. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
440 """ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
441 if module_or_name in sys.modules: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
442 module_or_name = sys.modules[module_or_name] |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
443 if isinstance(module_or_name, ModuleType): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
444 module = module_or_name |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
445 loader = getattr(module, '__loader__', None) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
446 if loader is not None: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
447 return loader |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
448 fullname = module.__name__ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
449 else: |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
450 fullname = module_or_name |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
451 return find_loader(fullname) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
452 |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
453 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
454 def find_loader(fullname): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
455 """Find a PEP 302 "loader" object for fullname |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
456 |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
457 This is s convenience wrapper around :func:`importlib.find_loader` that |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
458 sets the *path* argument correctly when searching for submodules, and |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
459 also ensures parent packages (if any) are imported before searching for |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
460 submodules. |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
461 """ |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
462 if fullname.startswith('.'): |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
463 msg = "Relative module name {!r} not supported".format(fullname) |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
464 raise ImportError(msg) |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
465 path = None |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
466 pkg_name = fullname.rpartition(".")[0] |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
467 if pkg_name: |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
468 pkg = importlib.import_module(pkg_name) |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
469 path = getattr(pkg, "__path__", None) |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
470 if path is None: |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
471 return None |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
472 try: |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
473 return importlib.find_loader(fullname, path) |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
474 except (ImportError, AttributeError, TypeError, ValueError) as ex: |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
475 # This hack fixes an impedance mismatch between pkgutil and |
|
80929
15a391919deb
Issue #16714: use 'raise' exceptions, don't 'throw'.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
78195
diff
changeset
|
476 # importlib, where the latter raises other errors for cases where |
|
80950
55d86476d048
replace threw with raised (#16714)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80929
diff
changeset
|
477 # pkgutil previously raised ImportError |
|
78107
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
478 msg = "Error while finding loader for {!r} ({}: {})" |
|
3987667bf98f
Take the first step in resolving the messy pkgutil vs importlib edge cases by basing pkgutil explicitly on importlib, deprecating its internal import emulation and setting __main__.__loader__ correctly so that runpy still works (Affects #15343, #15314, #15357)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78038
diff
changeset
|
479 raise ImportError(msg.format(fullname, type(ex), ex)) from ex |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
30448
diff
changeset
|
480 |
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 def extend_path(path, name): |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 """Extend a package's path. |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 Intended use is to place the following code in a package's __init__.py: |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 from pkgutil import extend_path |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 __path__ = extend_path(__path__, __name__) |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
489 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
490 This will add to the package's __path__ all subdirectories of |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
491 directories on sys.path named after the package. This is useful |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 if one wants to distribute different parts of a single logical |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 package as multiple directories. |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 It also looks for *.pkg files beginning where * matches the name |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 argument. This feature is similar to *.pth files (see site.py), |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 except that it doesn't special-case lines starting with 'import'. |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 A *.pkg file is trusted at face value: apart from checking for |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 duplicates, all entries found in a *.pkg file are added to the |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 path, regardless of whether they are exist the filesystem. (This |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 is a feature.) |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
503 If the input path is not a list (as is the case for frozen |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
504 packages) it is returned unchanged. The input path is not |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 modified; an extended copy is returned. Items are only appended |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 to the copy at the end. |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
508 It is assumed that sys.path is a sequence. Items of sys.path that |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 are not (unicode or 8-bit) strings referring to existing |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 directories are ignored. Unicode items of sys.path that cause |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 errors when used as filenames may cause this function to raise an |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 exception (in line with os.path.isdir() behavior). |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 """ |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 if not isinstance(path, list): |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 # This could happen e.g. when this is called from inside a |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 # frozen package. Return the path unchanged in that case. |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 return path |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 |
| 42622 | 520 sname_pkg = name + ".pkg" |
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 path = path[:] # Start with a copy of the existing path |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 |
|
78038
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
524 parent_package, _, final_name = name.rpartition('.') |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
525 if parent_package: |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
526 try: |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
527 search_path = sys.modules[parent_package].__path__ |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
528 except (KeyError, AttributeError): |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
529 # We can't do anything: find_loader() returns None when |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
530 # passed a dotted name. |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
531 return path |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
532 else: |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
533 search_path = sys.path |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
534 |
|
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
535 for dir in search_path: |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
536 if not isinstance(dir, str): |
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
537 continue |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
538 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
539 finder = get_importer(dir) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
540 if finder is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
541 # Is this finder PEP 420 compliant? |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
542 if hasattr(finder, 'find_loader'): |
|
78038
a7b8c3323db9
Issue #15294: Fix a regression in pkgutil.extend_path()'s handling of nested namespace packages.
Antoine Pitrou <solipsis@pitrou.net>
parents:
77126
diff
changeset
|
543 loader, portions = finder.find_loader(final_name) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
544 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
545 # No, no need to call it |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
546 loader = None |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
547 portions = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
548 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
549 for portion in portions: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
550 # XXX This may still add duplicate entries to path on |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
551 # case-insensitive filesystems |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
552 if portion not in path: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
553 path.append(portion) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76584
diff
changeset
|
554 |
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
555 # XXX Is this the right thing for subpackages like zope.app? |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
556 # It looks for a file named "zope.app.pkg" |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
557 pkgfile = os.path.join(dir, sname_pkg) |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
558 if os.path.isfile(pkgfile): |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
559 try: |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
560 f = open(pkgfile) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80951
diff
changeset
|
561 except OSError as msg: |
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
562 sys.stderr.write("Can't open %s: %s\n" % |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 (pkgfile, msg)) |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 else: |
|
82168
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
565 with f: |
|
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
566 for line in f: |
|
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
567 line = line.rstrip('\n') |
|
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
568 if not line or line.startswith('#'): |
|
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
569 continue |
|
cb876235f29d
modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
81039
diff
changeset
|
570 path.append(line) # Don't check for existence! |
|
26753
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 |
|
7c15bf7726b2
Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
572 return path |
|
46478
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
573 |
|
87347
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
574 |
|
46478
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
575 def get_data(package, resource): |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
576 """Get a resource from a package. |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
577 |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
578 This is a wrapper round the PEP 302 loader get_data API. The package |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
579 argument should be the name of a package, in standard module format |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
580 (foo.bar). The resource argument should be in the form of a relative |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
581 filename, using '/' as the path separator. The parent directory name '..' |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
582 is not allowed, and nor is a rooted name (starting with a '/'). |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
583 |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
584 The function returns a binary string, which is the contents of the |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
585 specified resource. |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
586 |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
587 For packages located in the filesystem, which have already been imported, |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
588 this is the rough equivalent of |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
589 |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
590 d = os.path.dirname(sys.modules[package].__file__) |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
591 data = open(os.path.join(d, resource), 'rb').read() |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
592 |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
593 If the package cannot be located or loaded, or it uses a PEP 302 loader |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
594 which does not support get_data(), then None is returned. |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
595 """ |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
596 |
|
87347
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
597 spec = importlib.find_spec(package) |
|
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
598 if spec is None: |
|
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
599 return None |
|
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
600 loader = spec.loader |
|
46478
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
601 if loader is None or not hasattr(loader, 'get_data'): |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
602 return None |
|
87347
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
603 # XXX needs test |
|
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
604 mod = (sys.modules.get(package) or |
|
07229c6104b1
Implement PEP 451 (ModuleSpec).
Eric Snow <ericsnowcurrently@gmail.com>
parents:
86657
diff
changeset
|
605 importlib._bootstrap._SpecMethods(spec).load()) |
|
46478
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
606 if mod is None or not hasattr(mod, '__file__'): |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
607 return None |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
608 |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
609 # Modify the resource name to be compatible with the loader.get_data |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
610 # signature - an os.path format "filename" starting with the dirname of |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
611 # the package's __file__ |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
612 parts = resource.split('/') |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
613 parts.insert(0, os.path.dirname(mod.__file__)) |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
614 resource_name = os.path.join(*parts) |
|
beb7abcd6c01
Merged revisions 62350-62355,62358-62359,62364-62365,62370,62372-62375,62378-62379,62381 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43577
diff
changeset
|
615 return loader.get_data(resource_name) |
