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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fb90e2ff95b7 utilize yield from
Philip Jenvey <pjenvey@underboss.org>
parents: 78195
diff changeset
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
4d2aa4bfb2d6 Remove RISCOS support
Skip Montanaro <skip@pobox.com>
parents: 40587
diff changeset
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)