annotate Lib/pkgutil.py @ 84007:dbfbdf2b5c19 3.3

Fix #17967: For ftp urls CWD to target instead of hopping to each directory towards target. This fixes a bug where target is accessible, but parent directories are restricted.
author Senthil Kumaran <senthil@uthcode.com>
date Sat, 01 Jun 2013 08:27:06 -0700
parents c40b50d65a00
children 3bb5a8a4830e
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
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 import os
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 import sys
78195
4431dc4bb770 Close #15386: There was a loophole that meant importlib.machinery and imp would sometimes reference an uninitialised copy of importlib._bootstrap
Nick Coghlan <ncoghlan@gmail.com>
parents: 78111
diff changeset
5 import importlib
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
6 import imp
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
7 import os.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
8 from warnings import warn
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
9 from types import 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
10
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
11 __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
12 '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
13 '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
14 '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
15 ]
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
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 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
18 # 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
19 # 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
20 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
21
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 magic = stream.read(4)
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 if magic != imp.get_magic():
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 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
25
74358
87331661042b Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents: 72775
diff changeset
26 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
27 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
28
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
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 def simplegeneric(func):
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 """Make a trivial single-dispatch generic 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
32 registry = {}
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
33 def wrapper(*args, **kw):
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
34 ob = args[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
35 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
36 cls = ob.__class__
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
37 except AttributeError:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
38 cls = type(ob)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
39 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
40 mro = cls.__mro__
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
41 except AttributeError:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
42 try:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
43 class cls(cls, object):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
44 pass
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
45 mro = cls.__mro__[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
46 except TypeError:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
47 mro = object, # must be an ExtensionClass or some such :(
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
48 for t in mro:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
49 if t in registry:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
50 return registry[t](*args, **kw)
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
51 else:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
52 return func(*args, **kw)
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
53 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
54 wrapper.__name__ = func.__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
55 except (TypeError, AttributeError):
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
56 pass # Python 2.3 doesn't allow functions to be renamed
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
57
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
58 def register(typ, func=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
59 if func 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
60 return lambda f: register(typ, f)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
61 registry[typ] = func
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
62 return func
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
63
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 wrapper.__dict__ = func.__dict__
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 wrapper.__doc__ = func.__doc__
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 wrapper.register = register
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 return wrapper
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
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 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
71 """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
72 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
73
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
74 '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
75 modules in.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
76
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
77 '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
78 on output.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
79
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
80 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
81 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
82 attribute to find submodules.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
83
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
84 '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
85 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
86 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
87 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
88 exceptions are propagated, terminating the search.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
89
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
90 Examples:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
91
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
92 # list all modules python can access
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
93 walk_packages()
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
94
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
95 # list all submodules of ctypes
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
96 walk_packages(ctypes.__path__, ctypes.__name__+'.')
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
97 """
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
98
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
99 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
100 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
101 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
102 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
103
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 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
105 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
106
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 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
108 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
109 __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
110 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
111 if onerror is not None:
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
112 onerror(name)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
113 except Exception:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
114 if onerror is not None:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
115 onerror(name)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
116 else:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
117 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
118 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
119 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
120
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
121 # 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
122 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
123
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
124 for item in 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
125 yield 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
126
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
127
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
128 def iter_modules(path=None, prefix=''):
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
129 """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
130 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
131
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
132 '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
133 modules in.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
134
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
135 '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
136 on output.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
137 """
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
138
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
139 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
140 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
141 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
142 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
143
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
144 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
145 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
146 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
147 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
148 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
149 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
150
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
151
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
152 #@simplegeneric
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
153 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
154 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
155 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
156 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
157
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
158 iter_importer_modules = simplegeneric(iter_importer_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
159
78111
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
160 # 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
161 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
162 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
163 return
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
164
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
165 yielded = {}
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
166 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
167 try:
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
168 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
169 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
170 # 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
171 filenames = []
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
172 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
173
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
174 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
175 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
176 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
177 continue
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
178
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
179 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
180 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
181
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
182 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
183 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
184 try:
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
185 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
186 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
187 # 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
188 dircontents = []
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
189 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
190 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
191 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
192 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
193 break
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
194 else:
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
195 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
196
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
197 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
198 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
199 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
200
9101eab6178c Issue #15343: Handle importlib.machinery.FileFinder instances in pkgutil.walk_packages (et al)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78107
diff changeset
201 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
202 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
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 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
205 """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
206
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 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
208 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
209 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
210
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
211 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
212 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
213 """
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
214
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 def __init__(self, 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
216 warn("This emulation is deprecated, use 'importlib' instead",
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
217 DeprecationWarning)
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
218 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
219
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 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
221 # 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
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 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
230 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
231 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
232 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
233 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
234
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 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
236 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
237 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
238
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 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
240 import inspect
72774
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
241 try:
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
242 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
243 except OSError:
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
244 # 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
245 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
246 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
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 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
249 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
250 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
251 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
252
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
253 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
254 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
255
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 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
257 modname = fn
72774
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
258 try:
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
259 dircontents = os.listdir(path)
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
260 except OSError:
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
261 # 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
262 dircontents = []
77bac85f610a Issue #7367: Fix pkgutil.walk_paths to skip directories whose
Ned Deily <nad@acm.org>
parents: 70410
diff changeset
263 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
264 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
265 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
266 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
267 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
268 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
269 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
270
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
271 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
272 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
273 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
274
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
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
276 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
277 """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
278 """
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 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
280
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 def __init__(self, fullname, file, filename, etc):
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
282 warn("This emulation is deprecated, use 'importlib' instead",
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
283 DeprecationWarning)
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
284 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
285 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
286 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
287 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
288
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 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
290 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
291 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
292 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
293 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
294 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
295 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
296 # 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
297 # 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
298 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
299
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 def get_data(self, pathname):
65730
d161714e7c92 Have pkgutil properly close files.
Brett Cannon <bcannon@gmail.com>
parents: 55602
diff changeset
301 with open(pathname, "rb") as file:
d161714e7c92 Have pkgutil properly close files.
Brett Cannon <bcannon@gmail.com>
parents: 55602
diff changeset
302 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
303
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 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
305 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
306 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
307 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
308 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
309 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
310 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
311
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 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
313 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
314 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
315 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
316 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
317 "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
318 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
319
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 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
321 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
322 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
323
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 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
333 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
334 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
335 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
336 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
337 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
338 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
339 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
340
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 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
342 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
343 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
344 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
345 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
346 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
347 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
348 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
349 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
350 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
351 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
352 if os.path.exists(self.filename[:-1]):
69823
be5b8d1ded34 Replace open(filename, 'rU') by open(filename, 'r')
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65730
diff changeset
353 f = open(self.filename[:-1], '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
354 self.source = f.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
355 f.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
356 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
357 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
358 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
359
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
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 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
362 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
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 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
365 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
366 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
367 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
368 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
369 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
370 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
371 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
372
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
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 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
375 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
376 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
377
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 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
379 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
380 _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
381 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
382 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
383 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
384 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
385 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
386 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
387
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 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
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 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
391 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
392 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
393 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
394
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 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
396 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
397
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 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
399 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
400 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
401
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 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
403 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
404 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
405
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 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
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 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
409 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
410
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
411
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
412 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
413 """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
414
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
415 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
416 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
417
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
418 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
419 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
420 """
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 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
422 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
423 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
424 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
425 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
426 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
427 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
428 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
429 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
430 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
431 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
432 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
433 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
434
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
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 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
437 """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
438
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 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
440 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
441 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
442
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
443 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
444 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
445
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
446 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
447 """
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 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
449 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
450 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
451 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
452 # 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
453 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
454 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
455 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
456 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
457 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
458 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
459 for importer in 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
460 yield 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
461 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
462 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
463 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
464
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
465 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
466 """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
467
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
468 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
469 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
470 (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
471 """
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 30448
diff changeset
472 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
473 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
474 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
475 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
476 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
477 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
478 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
479 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
480 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
481 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
482 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
483
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
484
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
485 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
486 """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
487
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
488 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
489 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
490 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
491 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
492 """
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
493 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
494 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
495 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
496 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
497 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
498 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
499 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
500 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
501 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
502 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
503 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
504 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
505 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
506 # 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
507 # 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
508 # 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
509 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
510 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
511
26753
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
512
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
513 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
514 """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
515
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 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
517
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 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
519 __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
520
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 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
522 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
523 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
524 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
525
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 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
527 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
528 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
529 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
530 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
531 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
532 is a feature.)
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
533
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 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
535 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
536 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
537 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
538
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 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
540 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
541 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
542 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
543 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
544 """
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
545
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 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
547 # 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
548 # 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
549 return path
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
550
42622
4d2aa4bfb2d6 Remove RISCOS support
Skip Montanaro <skip@pobox.com>
parents: 40587
diff changeset
551 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
552
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 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
554
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
555 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
556 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
557 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
558 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
559 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
560 # 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
561 # 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
562 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
563 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
564 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
565
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
566 for dir in search_path:
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
567 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
568 continue
77126
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
569
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
570 finder = get_importer(dir)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
571 if finder is not None:
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
572 # Is this finder PEP 420 compliant?
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
573 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
574 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
575 else:
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
576 # No, no need to call it
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
577 loader = None
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
578 portions = []
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
579
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
580 for portion in portions:
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
581 # 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
582 # case-insensitive filesystems
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
583 if portion not in path:
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
584 path.append(portion)
702009f3c0b1 issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents: 76584
diff changeset
585
26753
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 # 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
587 # 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
588 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
589 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
590 try:
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 f = open(pkgfile)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
592 except IOError as msg:
26753
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 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
594 (pkgfile, msg))
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 else:
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 for line in f:
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 line = line.rstrip('\n')
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 if not line or line.startswith('#'):
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 continue
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 path.append(line) # Don't check for existence!
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 f.close()
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
602
7c15bf7726b2 Last week we discussed adding this module to the standard library.
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 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
604
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
605 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
606 """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
607
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 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
609 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
610 (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
611 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
612 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
613
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 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
615 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
616
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
617 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
618 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
619
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
620 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
621 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
622
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
623 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
624 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
625 """
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
626
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
627 loader = get_loader(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
628 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
629 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
630 mod = sys.modules.get(package) or loader.load_module(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
631 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
632 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
633
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
634 # 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
635 # 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
636 # 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
637 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
638 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
639 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
640 return loader.get_data(resource_name)