Mercurial > cpython-lru_cache-weakref
annotate Lib/importlib/_bootstrap.py @ 84172:e353f64dfd95
importlib.abc.SourceLoader.get_source() was re-raising SyntaxError and
UnicodeDecodeError as ImportError. That was over-reaching the point of
raising ImportError in get_source() (which is to signal the source
code was not found when it should have). Conflating the two exceptions
with ImportError could lead to masking errors with the source which
should be known outside of whether there was an error simply getting
the source to begin with.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Sun, 16 Jun 2013 18:05:54 -0400 |
| parents | 205aa49e5cd5 |
| children | bdd60bedf933 |
| rev | line source |
|---|---|
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1 """Core implementation of import. |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
2 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
3 This module is NOT meant to be directly imported! It has been designed such |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
4 that it can be bootstrapped into Python as the implementation of import. As |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
5 such it requires the injection of specific modules and attributes in order to |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
6 work. One should use importlib as the public-facing version of this module. |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
7 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
8 """ |
|
76549
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
9 # |
|
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
10 # IMPORTANT: Whenever making changes to this module, be sure to run |
|
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
11 # a top-level make in order to get the frozen version of the module |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
12 # update. Not doing so will result in the Makefile to fail for |
|
76549
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
13 # all others who don't have a ./python around to freeze the module |
|
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
14 # in the early stages of compilation. |
|
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
15 # |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
16 |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
17 # See importlib._setup() for what is injected into the global namespace. |
|
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
18 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
19 # When editing this code be aware that code executed at import time CANNOT |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
20 # reference any injected objects! This includes not only global code but also |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
21 # anything specified at the class level. |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
22 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
23 # Bootstrap-related code ###################################################### |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
24 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
25 _CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' |
|
74643
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
26 |
|
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
27 |
|
75055
b8576719fe71
_relax_case -> _make_relax_case
Antoine Pitrou <solipsis@pitrou.net>
parents:
75048
diff
changeset
|
28 def _make_relax_case(): |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
29 if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
30 def _relax_case(): |
|
75070
defd944af91b
put docstrings on functions
Benjamin Peterson <benjamin@python.org>
parents:
75055
diff
changeset
|
31 """True if filenames must be checked case-insensitively.""" |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
32 return b'PYTHONCASEOK' in _os.environ |
|
74643
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
33 else: |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
34 def _relax_case(): |
|
75070
defd944af91b
put docstrings on functions
Benjamin Peterson <benjamin@python.org>
parents:
75055
diff
changeset
|
35 """True if filenames must be checked case-insensitively.""" |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
36 return False |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
37 return _relax_case |
|
74643
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
38 |
|
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
39 |
|
74630
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
40 def _w_long(x): |
|
83963
185a0e649fb8
Issue #18070: importlib.util.module_for_loader() now sets __loader__
Brett Cannon <brett@python.org>
parents:
83960
diff
changeset
|
41 """Convert a 32-bit integer to little-endian.""" |
|
82385
d98a82f4c9bd
Issue #17220: two fixes for changeset 2528e4aea338.
Brett Cannon <brett@python.org>
parents:
82382
diff
changeset
|
42 return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
43 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
44 |
|
74630
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
45 def _r_long(int_bytes): |
|
83963
185a0e649fb8
Issue #18070: importlib.util.module_for_loader() now sets __loader__
Brett Cannon <brett@python.org>
parents:
83960
diff
changeset
|
46 """Convert 4 bytes in little-endian to an integer.""" |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
47 return int.from_bytes(int_bytes, 'little') |
|
74630
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
48 |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
49 |
|
76472
4e853913054c
Issue #13959: Continue to try to accomodate altsep in importlib by not
Brett Cannon <brett@python.org>
parents:
76466
diff
changeset
|
50 def _path_join(*path_parts): |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
51 """Replacement for os.path.join().""" |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
52 return path_sep.join([part.rstrip(path_separators) |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
53 for part in path_parts if part]) |
|
74630
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
54 |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
55 |
|
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
56 def _path_split(path): |
|
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
57 """Replacement for os.path.split().""" |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
58 if len(path_separators) == 1: |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
59 front, _, tail = path.rpartition(path_sep) |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
60 return front, tail |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
61 for x in reversed(path): |
|
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
62 if x in path_separators: |
|
82385
d98a82f4c9bd
Issue #17220: two fixes for changeset 2528e4aea338.
Brett Cannon <brett@python.org>
parents:
82382
diff
changeset
|
63 front, tail = path.rsplit(x, maxsplit=1) |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
64 return front, tail |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
65 return '', path |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
66 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
67 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
68 def _path_is_mode_type(path, mode): |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
69 """Test whether the path is the specified mode type.""" |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
70 try: |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
71 stat_info = _os.stat(path) |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
72 except OSError: |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
73 return False |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
74 return (stat_info.st_mode & 0o170000) == mode |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
75 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
76 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
77 # XXX Could also expose Modules/getpath.c:isfile() |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
78 def _path_isfile(path): |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
79 """Replacement for os.path.isfile.""" |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
80 return _path_is_mode_type(path, 0o100000) |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
81 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
82 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
83 # XXX Could also expose Modules/getpath.c:isdir() |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
84 def _path_isdir(path): |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
85 """Replacement for os.path.isdir.""" |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
86 if not path: |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
87 path = _os.getcwd() |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
88 return _path_is_mode_type(path, 0o040000) |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
89 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
90 |
|
78722
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
91 def _write_atomic(path, data, mode=0o666): |
|
75185
27d31f0c4ad5
Issue #14077: importlib: Fix regression introduced by de6703671386.
Charles-François Natali <neologix@free.fr>
parents:
75082
diff
changeset
|
92 """Best-effort function to write data to a path atomically. |
|
27d31f0c4ad5
Issue #14077: importlib: Fix regression introduced by de6703671386.
Charles-François Natali <neologix@free.fr>
parents:
75082
diff
changeset
|
93 Be prepared to handle a FileExistsError if concurrent writing of the |
|
27d31f0c4ad5
Issue #14077: importlib: Fix regression introduced by de6703671386.
Charles-François Natali <neologix@free.fr>
parents:
75082
diff
changeset
|
94 temporary file is attempted.""" |
|
73573
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
95 # id() is used to generate a pseudo-random filename. |
|
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
96 path_tmp = '{}.{}'.format(path, id(path)) |
|
78722
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
97 fd = _os.open(path_tmp, |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
98 _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, mode & 0o666) |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
99 try: |
|
74998
de6703671386
Have importlib use os.replace() for atomic renaming.
Brett Cannon <brett@python.org>
parents:
74994
diff
changeset
|
100 # We first write data to a temporary file, and then use os.replace() to |
|
de6703671386
Have importlib use os.replace() for atomic renaming.
Brett Cannon <brett@python.org>
parents:
74994
diff
changeset
|
101 # perform an atomic rename. |
|
73573
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
102 with _io.FileIO(fd, 'wb') as file: |
|
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
103 file.write(data) |
|
74998
de6703671386
Have importlib use os.replace() for atomic renaming.
Brett Cannon <brett@python.org>
parents:
74994
diff
changeset
|
104 _os.replace(path_tmp, path) |
|
73573
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
105 except OSError: |
|
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
106 try: |
|
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
107 _os.unlink(path_tmp) |
|
72960
c16063765d3a
Issue #13146: Writing a pyc file is now atomic under POSIX.
Antoine Pitrou <solipsis@pitrou.net>
parents:
68887
diff
changeset
|
108 except OSError: |
|
73573
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
109 pass |
|
b75b41237380
Issue #13392: Writing a pyc file should now be atomic under Windows as well.
Antoine Pitrou <solipsis@pitrou.net>
parents:
73477
diff
changeset
|
110 raise |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
111 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
112 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
113 def _wrap(new, old): |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
114 """Simple substitute for functools.update_wrapper.""" |
|
73977
54a77c556d9a
Issue #13593: updating the importlib utility decorators for __qualname__.
Meador Inge <meadori@gmail.com>
parents:
73974
diff
changeset
|
115 for replace in ['__module__', '__name__', '__qualname__', '__doc__']: |
|
74838
7a6fd7cd16e9
Don't fail in the face of a lacking attribute when wrapping a
Brett Cannon <brett@python.org>
parents:
74643
diff
changeset
|
116 if hasattr(old, replace): |
|
7a6fd7cd16e9
Don't fail in the face of a lacking attribute when wrapping a
Brett Cannon <brett@python.org>
parents:
74643
diff
changeset
|
117 setattr(new, replace, getattr(old, replace)) |
|
51433
43d3a95ed662
Create a simple substitute for functools.wraps to use in importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
51430
diff
changeset
|
118 new.__dict__.update(old.__dict__) |
|
43d3a95ed662
Create a simple substitute for functools.wraps to use in importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
51430
diff
changeset
|
119 |
|
43d3a95ed662
Create a simple substitute for functools.wraps to use in importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
51430
diff
changeset
|
120 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
121 _code_type = type(_wrap.__code__) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
122 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
123 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
124 # Module-level locking ######################################################## |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
125 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
126 # A dict mapping module names to weakrefs of _ModuleLock instances |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
127 _module_locks = {} |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
128 # A dict mapping thread ids to _ModuleLock instances |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
129 _blocking_on = {} |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
130 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
131 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
132 class _DeadlockError(RuntimeError): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
133 pass |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
134 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
135 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
136 class _ModuleLock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
137 """A recursive lock implementation which is able to detect deadlocks |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
138 (e.g. thread 1 trying to take locks A then B, and thread 2 trying to |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
139 take locks B then A). |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
140 """ |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
141 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
142 def __init__(self, name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
143 self.lock = _thread.allocate_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
144 self.wakeup = _thread.allocate_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
145 self.name = name |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
146 self.owner = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
147 self.count = 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
148 self.waiters = 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
149 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
150 def has_deadlock(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
151 # Deadlock avoidance for concurrent circular imports. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
152 me = _thread.get_ident() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
153 tid = self.owner |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
154 while True: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
155 lock = _blocking_on.get(tid) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
156 if lock is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
157 return False |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
158 tid = lock.owner |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
159 if tid == me: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
160 return True |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
161 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
162 def acquire(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
163 """ |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
164 Acquire the module lock. If a potential deadlock is detected, |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
165 a _DeadlockError is raised. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
166 Otherwise, the lock is always acquired and True is returned. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
167 """ |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
168 tid = _thread.get_ident() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
169 _blocking_on[tid] = self |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
170 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
171 while True: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
172 with self.lock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
173 if self.count == 0 or self.owner == tid: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
174 self.owner = tid |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
175 self.count += 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
176 return True |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
177 if self.has_deadlock(): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
178 raise _DeadlockError("deadlock detected by %r" % self) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
179 if self.wakeup.acquire(False): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
180 self.waiters += 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
181 # Wait for a release() call |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
182 self.wakeup.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
183 self.wakeup.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
184 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
185 del _blocking_on[tid] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
186 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
187 def release(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
188 tid = _thread.get_ident() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
189 with self.lock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
190 if self.owner != tid: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
191 raise RuntimeError("cannot release un-acquired lock") |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
192 assert self.count > 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
193 self.count -= 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
194 if self.count == 0: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
195 self.owner = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
196 if self.waiters: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
197 self.waiters -= 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
198 self.wakeup.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
199 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
200 def __repr__(self): |
|
79692
987a8724b220
Remove uses of % with str.format.
Brett Cannon <brett@python.org>
parents:
79653
diff
changeset
|
201 return "_ModuleLock({!r}) at {}".format(self.name, id(self)) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
202 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
203 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
204 class _DummyModuleLock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
205 """A simple _ModuleLock equivalent for Python builds without |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
206 multi-threading support.""" |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
207 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
208 def __init__(self, name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
209 self.name = name |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
210 self.count = 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
211 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
212 def acquire(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
213 self.count += 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
214 return True |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
215 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
216 def release(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
217 if self.count == 0: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
218 raise RuntimeError("cannot release un-acquired lock") |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
219 self.count -= 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
220 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
221 def __repr__(self): |
|
79692
987a8724b220
Remove uses of % with str.format.
Brett Cannon <brett@python.org>
parents:
79653
diff
changeset
|
222 return "_DummyModuleLock({!r}) at {}".format(self.name, id(self)) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
223 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
224 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
225 # The following two functions are for consumption by Python/import.c. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
226 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
227 def _get_module_lock(name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
228 """Get or create the module lock for a given module name. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
229 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
230 Should only be called with the import lock taken.""" |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
231 lock = None |
|
78779
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
232 try: |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
233 lock = _module_locks[name]() |
|
78779
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
234 except KeyError: |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
235 pass |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
236 if lock is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
237 if _thread is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
238 lock = _DummyModuleLock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
239 else: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
240 lock = _ModuleLock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
241 def cb(_): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
242 del _module_locks[name] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
243 _module_locks[name] = _weakref.ref(lock, cb) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
244 return lock |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
245 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
246 def _lock_unlock_module(name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
247 """Release the global import lock, and acquires then release the |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
248 module lock for a given module name. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
249 This is used to ensure a module is completely initialized, in the |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
250 event it is being imported by another thread. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
251 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
252 Should only be called with the import lock taken.""" |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
253 lock = _get_module_lock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
254 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
255 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
256 lock.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
257 except _DeadlockError: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
258 # Concurrent circular import, we'll accept a partially initialized |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
259 # module object. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
260 pass |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
261 else: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
262 lock.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
263 |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
264 # Frame stripping magic ############################################### |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
265 |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
266 def _call_with_frames_removed(f, *args, **kwds): |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
267 """remove_importlib_frames in import.c will always remove sequences |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
268 of importlib frames that end with a call to this function |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
269 |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
270 Use it instead of a normal call in places where including the importlib |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
271 frames introduces unwanted noise into the traceback (e.g. when executing |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
272 module code) |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
273 """ |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
274 return f(*args, **kwds) |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
275 |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
276 |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
277 # Finder/loader utility code ############################################### |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
278 |
|
82957
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
279 # Magic word to reject .pyc files generated by other Python versions. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
280 # It should change for each incompatible change to the bytecode. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
281 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
282 # The value of CR and LF is incorporated so if you ever read or write |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
283 # a .pyc file in text mode the magic number will be wrong; also, the |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
284 # Apple MPW compiler swaps their values, botching string constants. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
285 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
286 # The magic numbers must be spaced apart at least 2 values, as the |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
287 # -U interpeter flag will cause MAGIC+1 being used. They have been |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
288 # odd numbers for some time now. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
289 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
290 # There were a variety of old schemes for setting the magic number. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
291 # The current working scheme is to increment the previous value by |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
292 # 10. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
293 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
294 # Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
295 # number also includes a new "magic tag", i.e. a human readable string used |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
296 # to represent the magic number in __pycache__ directories. When you change |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
297 # the magic number, you must also set a new unique magic tag. Generally this |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
298 # can be named after the Python major version of the magic number bump, but |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
299 # it can really be anything, as long as it's different than anything else |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
300 # that's come before. The tags are included in the following table, starting |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
301 # with Python 3.2a0. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
302 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
303 # Known values: |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
304 # Python 1.5: 20121 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
305 # Python 1.5.1: 20121 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
306 # Python 1.5.2: 20121 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
307 # Python 1.6: 50428 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
308 # Python 2.0: 50823 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
309 # Python 2.0.1: 50823 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
310 # Python 2.1: 60202 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
311 # Python 2.1.1: 60202 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
312 # Python 2.1.2: 60202 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
313 # Python 2.2: 60717 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
314 # Python 2.3a0: 62011 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
315 # Python 2.3a0: 62021 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
316 # Python 2.3a0: 62011 (!) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
317 # Python 2.4a0: 62041 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
318 # Python 2.4a3: 62051 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
319 # Python 2.4b1: 62061 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
320 # Python 2.5a0: 62071 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
321 # Python 2.5a0: 62081 (ast-branch) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
322 # Python 2.5a0: 62091 (with) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
323 # Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
324 # Python 2.5b3: 62101 (fix wrong code: for x, in ...) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
325 # Python 2.5b3: 62111 (fix wrong code: x += yield) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
326 # Python 2.5c1: 62121 (fix wrong lnotab with for loops and |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
327 # storing constants that should have been removed) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
328 # Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
329 # Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
330 # Python 2.6a1: 62161 (WITH_CLEANUP optimization) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
331 # Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
332 # Python 2.7a0: 62181 (optimize conditional branches: |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
333 # introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
334 # Python 2.7a0 62191 (introduce SETUP_WITH) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
335 # Python 2.7a0 62201 (introduce BUILD_SET) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
336 # Python 2.7a0 62211 (introduce MAP_ADD and SET_ADD) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
337 # Python 3000: 3000 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
338 # 3010 (removed UNARY_CONVERT) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
339 # 3020 (added BUILD_SET) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
340 # 3030 (added keyword-only parameters) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
341 # 3040 (added signature annotations) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
342 # 3050 (print becomes a function) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
343 # 3060 (PEP 3115 metaclass syntax) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
344 # 3061 (string literals become unicode) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
345 # 3071 (PEP 3109 raise changes) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
346 # 3081 (PEP 3137 make __file__ and __name__ unicode) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
347 # 3091 (kill str8 interning) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
348 # 3101 (merge from 2.6a0, see 62151) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
349 # 3103 (__file__ points to source file) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
350 # Python 3.0a4: 3111 (WITH_CLEANUP optimization). |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
351 # Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
352 # Python 3.1a0: 3141 (optimize list, set and dict comprehensions: |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
353 # change LIST_APPEND and SET_ADD, add MAP_ADD) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
354 # Python 3.1a0: 3151 (optimize conditional branches: |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
355 # introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
356 # Python 3.2a0: 3160 (add SETUP_WITH) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
357 # tag: cpython-32 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
358 # Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
359 # tag: cpython-32 |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
360 # Python 3.2a2 3180 (add DELETE_DEREF) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
361 # Python 3.3a0 3190 __class__ super closure changed |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
362 # Python 3.3a0 3200 (__qualname__ added) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
363 # 3210 (added size modulo 2**32 to the pyc header) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
364 # Python 3.3a1 3220 (changed PEP 380 implementation) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
365 # Python 3.3a4 3230 (revert changes to implicit __class__ closure) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
366 # Python 3.4a1 3250 (evaluate positional default arguments before |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
367 # keyword-only defaults) |
|
83572
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83376
diff
changeset
|
368 # Python 3.4a1 3260 (add LOAD_CLASSDEREF; allow locals of class to override |
|
cf65c7a75f55
check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents:
83376
diff
changeset
|
369 # free vars) |
| 84090 | 370 # Python 3.4a1 3270 (various tweaks to the __class__ closure) |
|
83791
6db3741e59be
rather than passing locals to the class body, just execute the class body in the proper environment
Benjamin Peterson <benjamin@python.org>
parents:
83783
diff
changeset
|
371 # Python 3.4a1 3280 (remove implicit class argument) |
|
82957
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
372 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
373 # MAGIC must change whenever the bytecode emitted by the compiler may no |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
374 # longer be understood by older implementations of the eval loop (usually |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
375 # due to the addition of new opcodes). |
|
78042
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78026
diff
changeset
|
376 |
|
84128
5619bc2d8207
Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document the
Brett Cannon <brett@python.org>
parents:
84109
diff
changeset
|
377 MAGIC_NUMBER = (3280).to_bytes(2, 'little') + b'\r\n' |
|
5619bc2d8207
Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document the
Brett Cannon <brett@python.org>
parents:
84109
diff
changeset
|
378 _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c |
|
78042
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78026
diff
changeset
|
379 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
380 _PYCACHE = '__pycache__' |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
381 |
|
76874
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
382 SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed. |
|
76451
ea46ebba8a0f
Issue #13959: Re-implement imp.source_from_cache() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76450
diff
changeset
|
383 |
|
76874
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
384 DEBUG_BYTECODE_SUFFIXES = ['.pyc'] |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
385 OPTIMIZED_BYTECODE_SUFFIXES = ['.pyo'] |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
386 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
387 def cache_from_source(path, debug_override=None): |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
388 """Given the path to a .py file, return the path to its .pyc/.pyo file. |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
389 |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
390 The .py file does not need to exist; this simply returns the path to the |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
391 .pyc/.pyo file calculated as if the .py file were imported. The extension |
|
79173
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
392 will be .pyc unless sys.flags.optimize is non-zero, then it will be .pyo. |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
393 |
| 79191 | 394 If debug_override is not None, then it must be a boolean and is used in |
| 395 place of sys.flags.optimize. | |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
396 |
|
78026
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
397 If sys.implementation.cache_tag is None then NotImplementedError is raised. |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
398 |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
399 """ |
|
79173
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
400 debug = not sys.flags.optimize if debug_override is None else debug_override |
|
76874
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
401 if debug: |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
402 suffixes = DEBUG_BYTECODE_SUFFIXES |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
403 else: |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
404 suffixes = OPTIMIZED_BYTECODE_SUFFIXES |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
405 head, tail = _path_split(path) |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
406 base_filename, sep, _ = tail.partition('.') |
|
78026
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
407 tag = sys.implementation.cache_tag |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
408 if tag is None: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
409 raise NotImplementedError('sys.implementation.cache_tag is None') |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
410 filename = ''.join([base_filename, sep, tag, suffixes[0]]) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
411 return _path_join(head, _PYCACHE, filename) |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
412 |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
413 |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
414 def source_from_cache(path): |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
415 """Given the path to a .pyc./.pyo file, return the path to its .py file. |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
416 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
417 The .pyc/.pyo file does not need to exist; this simply returns the path to |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
418 the .py file calculated to correspond to the .pyc/.pyo file. If path does |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
419 not conform to PEP 3147 format, ValueError will be raised. If |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
420 sys.implementation.cache_tag is None then NotImplementedError is raised. |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
421 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
422 """ |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
423 if sys.implementation.cache_tag is None: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
424 raise NotImplementedError('sys.implementation.cache_tag is None') |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
425 head, pycache_filename = _path_split(path) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
426 head, pycache = _path_split(head) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
427 if pycache != _PYCACHE: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
428 raise ValueError('{} not bottom-level directory in ' |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
429 '{!r}'.format(_PYCACHE, path)) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
430 if pycache_filename.count('.') != 2: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
431 raise ValueError('expected only 2 dots in ' |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
432 '{!r}'.format(pycache_filename)) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
433 base_filename = pycache_filename.partition('.')[0] |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
434 return _path_join(head, base_filename + SOURCE_SUFFIXES[0]) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
435 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
436 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
437 def _get_sourcefile(bytecode_path): |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
438 """Convert a bytecode file path to a source path (if possible). |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
439 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
440 This function exists purely for backwards-compatibility for |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
441 PyImport_ExecCodeModuleWithFilenames() in the C API. |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
442 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
443 """ |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
444 if len(bytecode_path) == 0: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
445 return None |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
446 rest, _, extension = bytecode_path.rparition('.') |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
447 if not rest or extension.lower()[-3:-1] != '.py': |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
448 return bytecode_path |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
449 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
450 try: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
451 source_path = source_from_cache(bytecode_path) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
452 except (NotImplementedError, ValueError): |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
453 source_path = bytcode_path[-1:] |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
454 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
455 return source_path if _path_isfile(source_stats) else bytecode_path |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
456 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
457 |
|
83376
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
458 def _calc_mode(path): |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
459 """Calculate the mode permissions for a bytecode file.""" |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
460 try: |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
461 mode = _os.stat(path).st_mode |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
462 except OSError: |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
463 mode = 0o666 |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
464 # We always ensure write access so we can update cached files |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
465 # later even when the source files are read-only on Windows (#6074) |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
466 mode |= 0o200 |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
467 return mode |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
468 |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
469 |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
470 def _verbose_message(message, *args, verbosity=1): |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
471 """Print the message to stderr if -v/PYTHONVERBOSE is turned on.""" |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
472 if sys.flags.verbose >= verbosity: |
|
76327
1ca10eb58483
utilize startswith(tuple)
Philip Jenvey <pjenvey@underboss.org>
parents:
76312
diff
changeset
|
473 if not message.startswith(('#', 'import ')): |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
474 message = '# ' + message |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
475 print(message.format(*args), file=sys.stderr) |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
476 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
477 |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
478 class _ManageReload: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
479 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
480 def __init__(self, name): |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
481 self._name = name |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
482 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
483 def __enter__(self): |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
484 self._is_reload = self._name in sys.modules |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
485 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
486 def __exit__(self, *args): |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
487 if any(arg is not None for arg in args) and not self._is_reload: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
488 try: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
489 del sys.modules[self._name] |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
490 except KeyError: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
491 pass |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
492 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
493 |
|
83988
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
494 # Written as a class only because contextlib is not available. |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
495 class _ModuleManager(_ManageReload): |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
496 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
497 """Context manager which returns the module to be loaded. |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
498 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
499 Does the proper unloading from sys.modules upon failure. |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
500 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
501 """ |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
502 |
|
83998
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
503 def __init__(self, name, *, reset_name=True): |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
504 """Prepare the context manager. |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
505 |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
506 The reset_name argument specifies whether to unconditionally reset |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
507 the __name__ attribute if the module is found to be a reload. |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
508 """ |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
509 super().__init__(name) |
|
83998
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
510 self._reset_name = reset_name |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
511 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
512 def __enter__(self): |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
513 super().__enter__() |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
514 self._module = sys.modules.get(self._name) |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
515 if not self._is_reload: |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
516 # This must be done before open() is called as the 'io' module |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
517 # implicitly imports 'locale' and would otherwise trigger an |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
518 # infinite loop. |
|
84134
9cacdb9d0c59
Issue #17907: touch up the code for imp.new_module().
Brett Cannon <brett@python.org>
parents:
84128
diff
changeset
|
519 self._module = type(_io)(self._name) |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
520 # This must be done before putting the module in sys.modules |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
521 # (otherwise an optimization shortcut in import.c becomes wrong) |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
522 self._module.__initializing__ = True |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
523 sys.modules[self._name] = self._module |
|
83998
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
524 elif self._reset_name: |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
525 try: |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
526 self._module.__name__ = self._name |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
527 except AttributeError: |
|
39cc1b04713e
Add a reset_name argument to importlib.util.module_to_load in order to
Brett Cannon <brett@python.org>
parents:
83988
diff
changeset
|
528 pass |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
529 return self._module |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
530 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
531 def __exit__(self, *args): |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
532 self._module.__initializing__ = False |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
533 del self._module |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
534 super().__exit__(*args) |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
535 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
536 |
|
83999
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
537 def module_to_load(name, *, reset_name=True): |
|
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
538 """Return a context manager which provides the module object to load. |
|
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
539 |
|
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
540 If reset_name is true, reset the module's __name__ to 'name'. |
|
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
541 """ |
|
83988
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
542 # Hiding _ModuleManager behind a function for better naming. |
|
83999
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
543 return _ModuleManager(name, reset_name=reset_name) |
|
83988
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
544 |
|
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
545 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
546 def _init_package_attrs(loader, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
547 """Set __package__ and __path__ based on what loader.is_package() says.""" |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
548 name = module.__name__ |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
549 try: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
550 is_package = loader.is_package(name) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
551 except ImportError: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
552 pass |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
553 else: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
554 if is_package: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
555 module.__package__ = name |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
556 module.__path__ = [] |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
557 else: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
558 module.__package__ = name.rpartition('.')[0] |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
559 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
560 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
561 def _init_file_attrs(loader, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
562 """Set __file__ and __path__ based on loader.get_filename().""" |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
563 try: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
564 module.__file__ = loader.get_filename(module.__name__) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
565 except ImportError: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
566 pass |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
567 else: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
568 if module.__name__ == module.__package__: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
569 module.__path__.append(_path_split(module.__file__)[0]) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
570 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
571 |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
572 def set_package(fxn): |
|
51430
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
573 """Set __package__ on the returned module.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
574 def set_package_wrapper(*args, **kwargs): |
|
51430
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
575 module = fxn(*args, **kwargs) |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
576 if getattr(module, '__package__', None) is None: |
|
51430
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
577 module.__package__ = module.__name__ |
|
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
578 if not hasattr(module, '__path__'): |
|
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
579 module.__package__ = module.__package__.rpartition('.')[0] |
|
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
580 return module |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
581 _wrap(set_package_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
582 return set_package_wrapper |
|
51430
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
583 |
|
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
584 |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
585 def set_loader(fxn): |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
586 """Set __loader__ on the returned module.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
587 def set_loader_wrapper(self, *args, **kwargs): |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
588 module = fxn(self, *args, **kwargs) |
|
82643
7647aae9481c
Issue #17117: Have both import itself and importlib.util.set_loader()
Brett Cannon <brett@python.org>
parents:
82385
diff
changeset
|
589 if getattr(module, '__loader__', None) is None: |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
590 module.__loader__ = self |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
591 return module |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
592 _wrap(set_loader_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
593 return set_loader_wrapper |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
594 |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
595 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
596 def _check_name(method): |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
597 """Decorator to verify that the module being requested matches the one the |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
598 loader can handle. |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
599 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
600 The first argument (self) must define _name which the second argument is |
|
68488
0991b40e895d
#11515: fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
58960
diff
changeset
|
601 compared against. If the comparison fails then ImportError is raised. |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
602 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
603 """ |
| 76877 | 604 def _check_name_wrapper(self, name=None, *args, **kwargs): |
| 605 if name is None: | |
| 606 name = self.name | |
| 607 elif self.name != name: | |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
608 raise ImportError("loader cannot handle %s" % name, name=name) |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
609 return method(self, name, *args, **kwargs) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
610 _wrap(_check_name_wrapper, method) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
611 return _check_name_wrapper |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
612 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
613 |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
614 def _requires_builtin(fxn): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
615 """Decorator to verify the named module is built-in.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
616 def _requires_builtin_wrapper(self, fullname): |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
617 if fullname not in sys.builtin_module_names: |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
618 raise ImportError("{} is not a built-in module".format(fullname), |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
619 name=fullname) |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
620 return fxn(self, fullname) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
621 _wrap(_requires_builtin_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
622 return _requires_builtin_wrapper |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
623 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
624 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
625 def _requires_frozen(fxn): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
626 """Decorator to verify the named module is frozen.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
627 def _requires_frozen_wrapper(self, fullname): |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
628 if not _imp.is_frozen(fullname): |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
629 raise ImportError("{} is not a frozen module".format(fullname), |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
630 name=fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
631 return fxn(self, fullname) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
632 _wrap(_requires_frozen_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
633 return _requires_frozen_wrapper |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
634 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
635 |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
636 def _find_module_shim(self, fullname): |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
637 """Try to find a loader for the specified module by delegating to |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
638 self.find_loader().""" |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
639 # Call find_loader(). If it returns a string (indicating this |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
640 # is a namespace package portion), generate a warning and |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
641 # return None. |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
642 loader, portions = self.find_loader(fullname) |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
643 if loader is None and len(portions): |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
644 msg = "Not importing directory {}: missing __init__" |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
645 _warnings.warn(msg.format(portions[0]), ImportWarning) |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
646 return loader |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
647 |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
648 |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
649 def _validate_bytecode_header(data, source_stats=None, name=None, path=None): |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
650 """Validate the header of the passed-in bytecode against source_stats (if |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
651 given) and returning the bytecode that can be compiled by compile(). |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
652 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
653 All other arguments are used to enhance error reporting. |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
654 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
655 ImportError is raised when the magic number is incorrect or the bytecode is |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
656 found to be stale. EOFError is raised when the data is found to be |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
657 truncated. |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
658 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
659 """ |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
660 exc_details = {} |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
661 if name is not None: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
662 exc_details['name'] = name |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
663 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
664 # To prevent having to make all messages have a conditional name. |
|
81735
792810303239
Touch up exception messaging
Brett Cannon <brett@python.org>
parents:
81432
diff
changeset
|
665 name = '<bytecode>' |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
666 if path is not None: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
667 exc_details['path'] = path |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
668 magic = data[:4] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
669 raw_timestamp = data[4:8] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
670 raw_size = data[8:12] |
|
84128
5619bc2d8207
Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document the
Brett Cannon <brett@python.org>
parents:
84109
diff
changeset
|
671 if magic != MAGIC_NUMBER: |
| 83056 | 672 message = 'bad magic number in {!r}: {!r}'.format(name, magic) |
| 673 _verbose_message(message) | |
| 674 raise ImportError(message, **exc_details) | |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
675 elif len(raw_timestamp) != 4: |
|
84046
6b189f29b1e6
tweak exception message (again)
Brett Cannon <brett@python.org>
parents:
84023
diff
changeset
|
676 message = 'reached EOF while reading timestamp in {!r}'.format(name) |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
677 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
678 raise EOFError(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
679 elif len(raw_size) != 4: |
|
84046
6b189f29b1e6
tweak exception message (again)
Brett Cannon <brett@python.org>
parents:
84023
diff
changeset
|
680 message = 'reached EOF while reading size of source in {!r}'.format(name) |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
681 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
682 raise EOFError(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
683 if source_stats is not None: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
684 try: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
685 source_mtime = int(source_stats['mtime']) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
686 except KeyError: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
687 pass |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
688 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
689 if _r_long(raw_timestamp) != source_mtime: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
690 message = 'bytecode is stale for {!r}'.format(name) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
691 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
692 raise ImportError(message, **exc_details) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
693 try: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
694 source_size = source_stats['size'] & 0xFFFFFFFF |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
695 except KeyError: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
696 pass |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
697 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
698 if _r_long(raw_size) != source_size: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
699 raise ImportError("bytecode is stale for {!r}".format(name), |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
700 **exc_details) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
701 return data[12:] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
702 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
703 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
704 def _compile_bytecode(data, name=None, bytecode_path=None, source_path=None): |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
705 """Compile bytecode as returned by _validate_bytecode_header().""" |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
706 code = marshal.loads(data) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
707 if isinstance(code, _code_type): |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
708 _verbose_message('code object from {!r}', bytecode_path) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
709 if source_path is not None: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
710 _imp._fix_co_filename(code, source_path) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
711 return code |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
712 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
713 raise ImportError("Non-code object in {!r}".format(bytecode_path), |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
714 name=name, path=bytecode_path) |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
715 |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
716 def _code_to_bytecode(code, mtime=0, source_size=0): |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
717 """Compile a code object into bytecode for writing out to a byte-compiled |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
718 file.""" |
|
84128
5619bc2d8207
Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document the
Brett Cannon <brett@python.org>
parents:
84109
diff
changeset
|
719 data = bytearray(MAGIC_NUMBER) |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
720 data.extend(_w_long(mtime)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
721 data.extend(_w_long(source_size)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
722 data.extend(marshal.dumps(code)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
723 return data |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
724 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
725 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
726 # Loaders ##################################################################### |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
727 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
728 class BuiltinImporter: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
729 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
730 """Meta path import for built-in modules. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
731 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
732 All methods are either class or static methods to avoid the need to |
|
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
733 instantiate the class. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
734 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
735 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
736 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
737 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
738 def module_repr(cls, module): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
739 return "<module '{}' (built-in)>".format(module.__name__) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
740 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
741 @classmethod |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
742 def find_module(cls, fullname, path=None): |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
743 """Find the built-in module. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
744 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
745 If 'path' is ever specified then the search is considered a failure. |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
746 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
747 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
748 if path is not None: |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
749 return None |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
750 return cls if _imp.is_builtin(fullname) else None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
751 |
|
51026
c26f1af26bfc
Document both importlib.machinery.BuiltinImporter and FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
50983
diff
changeset
|
752 @classmethod |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
753 @set_package |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
754 @set_loader |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
755 @_requires_builtin |
|
51026
c26f1af26bfc
Document both importlib.machinery.BuiltinImporter and FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
50983
diff
changeset
|
756 def load_module(cls, fullname): |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
757 """Load a built-in module.""" |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
758 with _ManageReload(fullname): |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
759 return _call_with_frames_removed(_imp.init_builtin, fullname) |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
760 |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
761 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
762 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
763 def get_code(cls, fullname): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
764 """Return None as built-in modules do not have code objects.""" |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
765 return None |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
766 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
767 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
768 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
769 def get_source(cls, fullname): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
770 """Return None as built-in modules do not have source code.""" |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
771 return None |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
772 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
773 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
774 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
775 def is_package(cls, fullname): |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
776 """Return False as built-in modules are never packages.""" |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
777 return False |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
778 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
779 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
780 class FrozenImporter: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
781 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
782 """Meta path import for frozen modules. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
783 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
784 All methods are either class or static methods to avoid the need to |
|
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
785 instantiate the class. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
786 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
787 """ |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
788 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
789 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
790 def module_repr(cls, m): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
791 return "<module '{}' (frozen)>".format(m.__name__) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
792 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
793 @classmethod |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
794 def find_module(cls, fullname, path=None): |
|
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
795 """Find a frozen module.""" |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
796 return cls if _imp.is_frozen(fullname) else None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
797 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
798 @classmethod |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
799 @set_package |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
800 @set_loader |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
801 @_requires_frozen |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
802 def load_module(cls, fullname): |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
803 """Load a frozen module.""" |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
804 with _ManageReload(fullname): |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
805 m = _call_with_frames_removed(_imp.init_frozen, fullname) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
806 # Let our own module_repr() method produce a suitable repr. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
807 del m.__file__ |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
808 return m |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
809 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
810 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
811 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
812 def get_code(cls, fullname): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
813 """Return the code object for the frozen module.""" |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
814 return _imp.get_frozen_object(fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
815 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
816 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
817 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
818 def get_source(cls, fullname): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
819 """Return None as frozen modules do not have source code.""" |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
820 return None |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
821 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
822 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
823 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
824 def is_package(cls, fullname): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
825 """Return True if the frozen module is a package.""" |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
826 return _imp.is_frozen_package(fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
827 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
828 |
|
78380
a1ac1e13c5a0
Close #15519: Properly expose WindowsRegistryFinder in importlib and bring the name into line with normal import terminology. Original patch by Eric Snow
Nick Coghlan <ncoghlan@gmail.com>
parents:
78344
diff
changeset
|
829 class WindowsRegistryFinder: |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
830 |
|
78380
a1ac1e13c5a0
Close #15519: Properly expose WindowsRegistryFinder in importlib and bring the name into line with normal import terminology. Original patch by Eric Snow
Nick Coghlan <ncoghlan@gmail.com>
parents:
78344
diff
changeset
|
831 """Meta path finder for modules declared in the Windows registry. |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
832 """ |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
833 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
834 REGISTRY_KEY = ( |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
835 "Software\\Python\\PythonCore\\{sys_version}" |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
836 "\\Modules\\{fullname}") |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
837 REGISTRY_KEY_DEBUG = ( |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
838 "Software\\Python\\PythonCore\\{sys_version}" |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
839 "\\Modules\\{fullname}\\Debug") |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
840 DEBUG_BUILD = False # Changed in _setup() |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
841 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
842 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
843 def _open_registry(cls, key): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
844 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
845 return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) |
|
80944
bb94f6222fef
Issue #16719: Get rid of WindowsError. Use OSError instead
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80930
diff
changeset
|
846 except OSError: |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
847 return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
848 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
849 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
850 def _search_registry(cls, fullname): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
851 if cls.DEBUG_BUILD: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
852 registry_key = cls.REGISTRY_KEY_DEBUG |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
853 else: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
854 registry_key = cls.REGISTRY_KEY |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
855 key = registry_key.format(fullname=fullname, |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
856 sys_version=sys.version[:3]) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
857 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
858 with cls._open_registry(key) as hkey: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
859 filepath = _winreg.QueryValue(hkey, "") |
|
80944
bb94f6222fef
Issue #16719: Get rid of WindowsError. Use OSError instead
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80930
diff
changeset
|
860 except OSError: |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
861 return None |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
862 return filepath |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
863 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
864 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
865 def find_module(cls, fullname, path=None): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
866 """Find module named in the registry.""" |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
867 filepath = cls._search_registry(fullname) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
868 if filepath is None: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
869 return None |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
870 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
871 _os.stat(filepath) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
872 except OSError: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
873 return None |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
874 for loader, suffixes, _ in _get_supported_file_loaders(): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
875 if filepath.endswith(tuple(suffixes)): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
876 return loader(fullname, filepath) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
877 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
878 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
879 class _LoaderBasics: |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
880 |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
881 """Base class of common code needed by both SourceLoader and |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
882 SourcelessFileLoader.""" |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
883 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
884 def is_package(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
885 """Concrete implementation of InspectLoader.is_package by checking if |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
886 the path returned by get_filename has a filename of '__init__.py'.""" |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
887 filename = _path_split(self.get_filename(fullname))[1] |
|
77457
240b7467e65c
Issue #14938: importlib.abc.SourceLoader.is_package() now takes the
Brett Cannon <brett@python.org>
parents:
77180
diff
changeset
|
888 filename_base = filename.rsplit('.', 1)[0] |
|
240b7467e65c
Issue #14938: importlib.abc.SourceLoader.is_package() now takes the
Brett Cannon <brett@python.org>
parents:
77180
diff
changeset
|
889 tail_name = fullname.rpartition('.')[2] |
|
240b7467e65c
Issue #14938: importlib.abc.SourceLoader.is_package() now takes the
Brett Cannon <brett@python.org>
parents:
77180
diff
changeset
|
890 return filename_base == '__init__' and tail_name != '__init__' |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
891 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
892 def init_module_attrs(self, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
893 """Set various attributes on the module. |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
894 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
895 ExecutionLoader.init_module_attrs() is used to set __loader__, |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
896 __package__, __file__, and optionally __path__. The __cached__ attribute |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
897 is set using imp.cache_from_source() and __file__. |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
898 """ |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
899 module.__loader__ = self # Loader |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
900 _init_package_attrs(self, module) # InspectLoader |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
901 _init_file_attrs(self, module) # ExecutionLoader |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
902 if hasattr(module, '__file__'): # SourceLoader |
|
78026
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
903 try: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
904 module.__cached__ = cache_from_source(module.__file__) |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
905 except NotImplementedError: |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
906 pass |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
907 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
908 def load_module(self, fullname): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
909 """Load the specified module into sys.modules and return it.""" |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
910 with module_to_load(fullname) as module: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
911 self.init_module_attrs(module) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
912 code = self.get_code(fullname) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
913 if code is None: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
914 raise ImportError('cannot load module {!r} when get_code() ' |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
915 'returns None'.format(fullname)) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
916 _call_with_frames_removed(exec, code, module.__dict__) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
917 return module |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
918 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
919 |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
920 class SourceLoader(_LoaderBasics): |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
921 |
|
67573
e125d92f7438
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
66226
diff
changeset
|
922 def path_mtime(self, path): |
|
67581
7d658b49b3e1
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
67573
diff
changeset
|
923 """Optional method that returns the modification time (an int) for the |
|
7d658b49b3e1
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
67573
diff
changeset
|
924 specified path, where path is a str. |
|
83225
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
925 |
|
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
926 Raises IOError when the path cannot be handled. |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
927 """ |
|
83225
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
928 raise IOError |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
929 |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
930 def path_stats(self, path): |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
931 """Optional method returning a metadata dict for the specified path |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
932 to by the path (str). |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
933 Possible keys: |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
934 - 'mtime' (mandatory) is the numeric timestamp of last source |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
935 code modification; |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
936 - 'size' (optional) is the size in bytes of the source code. |
|
52112
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
937 |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
938 Implementing this method allows the loader to read bytecode files. |
|
83225
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
939 Raises IOError when the path cannot be handled. |
|
52112
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
940 """ |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
941 return {'mtime': self.path_mtime(path)} |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
942 |
|
78722
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
943 def _cache_bytecode(self, source_path, cache_path, data): |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
944 """Optional method which writes data (bytes) to a file path (a str). |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
945 |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
946 Implementing this method allows for the writing of bytecode files. |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
947 |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
948 The source path is needed in order to correctly transfer permissions |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
949 """ |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
950 # For backwards compatibility, we delegate to set_data() |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
951 return self.set_data(cache_path, data) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
952 |
|
67573
e125d92f7438
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
66226
diff
changeset
|
953 def set_data(self, path, data): |
|
67581
7d658b49b3e1
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
67573
diff
changeset
|
954 """Optional method which writes data (bytes) to a file path (a str). |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
955 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
956 Implementing this method allows for the writing of bytecode files. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
957 """ |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
958 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
959 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
960 def get_source(self, fullname): |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
961 """Concrete implementation of InspectLoader.get_source.""" |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
962 path = self.get_filename(fullname) |
|
52112
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
963 try: |
|
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
964 source_bytes = self.get_data(path) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80944
diff
changeset
|
965 except OSError as exc: |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
966 raise ImportError("source not available through get_data()", |
|
78112
7d202353a728
Issue #15343: A lot more than just unicode decoding can go wrong when retrieving a source file
Nick Coghlan <ncoghlan@gmail.com>
parents:
78078
diff
changeset
|
967 name=fullname) from exc |
|
84172
e353f64dfd95
importlib.abc.SourceLoader.get_source() was re-raising SyntaxError and
Brett Cannon <brett@python.org>
parents:
84171
diff
changeset
|
968 import tokenize |
|
78112
7d202353a728
Issue #15343: A lot more than just unicode decoding can go wrong when retrieving a source file
Nick Coghlan <ncoghlan@gmail.com>
parents:
78078
diff
changeset
|
969 readsource = _io.BytesIO(source_bytes).readline |
|
84172
e353f64dfd95
importlib.abc.SourceLoader.get_source() was re-raising SyntaxError and
Brett Cannon <brett@python.org>
parents:
84171
diff
changeset
|
970 encoding = tokenize.detect_encoding(readsource) |
|
62761
32682b253ffc
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62756
diff
changeset
|
971 newline_decoder = _io.IncrementalNewlineDecoder(None, True) |
|
84172
e353f64dfd95
importlib.abc.SourceLoader.get_source() was re-raising SyntaxError and
Brett Cannon <brett@python.org>
parents:
84171
diff
changeset
|
972 return newline_decoder.decode(source_bytes.decode(encoding[0])) |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
973 |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
974 def source_to_code(self, data, path, *, _optimize=-1): |
|
80507
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
975 """Return the code object compiled from source. |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
976 |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
977 The 'data' argument can be any object type that compile() supports. |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
978 """ |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
979 return _call_with_frames_removed(compile, data, path, 'exec', |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
980 dont_inherit=True, optimize=_optimize) |
|
80507
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
981 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
982 def get_code(self, fullname): |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
983 """Concrete implementation of InspectLoader.get_code. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
984 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
985 Reading of bytecode requires path_stats to be implemented. To write |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
986 bytecode, set_data must also be implemented. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
987 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
988 """ |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
989 source_path = self.get_filename(fullname) |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
990 source_mtime = None |
|
78026
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
991 try: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
992 bytecode_path = cache_from_source(source_path) |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
993 except NotImplementedError: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
994 bytecode_path = None |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
995 else: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
996 try: |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
997 st = self.path_stats(source_path) |
|
83225
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
998 except IOError: |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
999 pass |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1000 else: |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1001 source_mtime = int(st['mtime']) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1002 try: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1003 data = self.get_data(bytecode_path) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80944
diff
changeset
|
1004 except OSError: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1005 pass |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1006 else: |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1007 try: |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1008 bytes_data = _validate_bytecode_header(data, |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1009 source_stats=st, name=fullname, |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1010 path=bytecode_path) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1011 except (ImportError, EOFError): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1012 pass |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1013 else: |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1014 _verbose_message('{} matches {}', bytecode_path, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
1015 source_path) |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1016 return _compile_bytecode(bytes_data, name=fullname, |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1017 bytecode_path=bytecode_path, |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1018 source_path=source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1019 source_bytes = self.get_data(source_path) |
|
80725
7caab48f171e
Issue #15627: This is simply an update to the name of a new method recently added
Eric Snow <ericsnowcurrently@gmail.com>
parents:
80530
diff
changeset
|
1020 code_object = self.source_to_code(source_bytes, source_path) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1021 _verbose_message('code object from {}', source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1022 if (not sys.dont_write_bytecode and bytecode_path is not None and |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1023 source_mtime is not None): |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1024 data = _code_to_bytecode(code_object, source_mtime, |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1025 len(source_bytes)) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1026 try: |
|
78722
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
1027 self._cache_bytecode(source_path, bytecode_path, data) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1028 _verbose_message('wrote {!r}', bytecode_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1029 except NotImplementedError: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1030 pass |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1031 return code_object |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1032 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1033 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1034 class FileLoader: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1035 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1036 """Base file loader class which implements the loader protocol methods that |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1037 require file system usage.""" |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1038 |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1039 def __init__(self, fullname, path): |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1040 """Cache the module name and the path to the file found by the |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1041 finder.""" |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1042 self.name = fullname |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1043 self.path = path |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1044 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
1045 @_check_name |
| 76877 | 1046 def load_module(self, fullname): |
| 1047 """Load a module from a file.""" | |
|
77180
bcb3b81853cc
Tweak importlib._bootstrap to avoid zero-argument super so I can work on issue #14857 without breaking imports
Nick Coghlan <ncoghlan@gmail.com>
parents:
77164
diff
changeset
|
1048 # Issue #14857: Avoid the zero-argument form so the implementation |
|
bcb3b81853cc
Tweak importlib._bootstrap to avoid zero-argument super so I can work on issue #14857 without breaking imports
Nick Coghlan <ncoghlan@gmail.com>
parents:
77164
diff
changeset
|
1049 # of that form can be updated without breaking the frozen module |
|
bcb3b81853cc
Tweak importlib._bootstrap to avoid zero-argument super so I can work on issue #14857 without breaking imports
Nick Coghlan <ncoghlan@gmail.com>
parents:
77164
diff
changeset
|
1050 return super(FileLoader, self).load_module(fullname) |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1051 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
1052 @_check_name |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1053 def get_filename(self, fullname): |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1054 """Return the path to the source file as found by the finder.""" |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1055 return self.path |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1056 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1057 def get_data(self, path): |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1058 """Return the data from path as raw bytes.""" |
|
64407
f8ba9558adbf
Remove redundant context manager.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
64291
diff
changeset
|
1059 with _io.FileIO(path, 'r') as file: |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1060 return file.read() |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1061 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1062 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1063 class SourceFileLoader(FileLoader, SourceLoader): |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1064 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1065 """Concrete implementation of SourceLoader using the file system.""" |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1066 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1067 def path_stats(self, path): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
1068 """Return the metadata for the path.""" |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1069 st = _os.stat(path) |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1070 return {'mtime': st.st_mtime, 'size': st.st_size} |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1071 |
|
78722
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
1072 def _cache_bytecode(self, source_path, bytecode_path, data): |
|
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
1073 # Adapt between the two APIs |
|
83376
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
1074 mode = _calc_mode(source_path) |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1075 return self.set_data(bytecode_path, data, _mode=mode) |
|
78722
3a831a0a29c4
Close #2501: Permission bits are once again correctly copied from the source file to the cached bytecode file. Test by Eric Snow.
Nick Coghlan <ncoghlan@gmail.com>
parents:
78663
diff
changeset
|
1076 |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1077 def set_data(self, path, data, *, _mode=0o666): |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1078 """Write bytes data to a file.""" |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
1079 parent, filename = _path_split(path) |
|
64240
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1080 path_parts = [] |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1081 # Figure out what directories are missing. |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1082 while parent and not _path_isdir(parent): |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
1083 parent, part = _path_split(parent) |
|
64240
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1084 path_parts.append(part) |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1085 # Create needed directories. |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1086 for part in reversed(path_parts): |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1087 parent = _path_join(parent, part) |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1088 try: |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1089 _os.mkdir(parent) |
|
73169
e4d44c2e8e81
Simplify and remove few dependencies on 'errno', thanks to PEP 3151.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
73016
diff
changeset
|
1090 except FileExistsError: |
|
64240
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1091 # Probably another Python process already created the dir. |
|
73169
e4d44c2e8e81
Simplify and remove few dependencies on 'errno', thanks to PEP 3151.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
73016
diff
changeset
|
1092 continue |
|
79741
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1093 except OSError as exc: |
|
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1094 # Could be a permission error, read-only filesystem: just forget |
|
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1095 # about writing the data. |
|
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1096 _verbose_message('could not create {!r}: {!r}', parent, exc) |
|
73169
e4d44c2e8e81
Simplify and remove few dependencies on 'errno', thanks to PEP 3151.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
73016
diff
changeset
|
1097 return |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1098 try: |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1099 _write_atomic(path, data, _mode) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1100 _verbose_message('created {!r}', path) |
|
79741
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1101 except OSError as exc: |
|
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1102 # Same as above: just don't write the bytecode. |
|
53ce30b62de2
Issue #15833: don't raise an exception if importlib can't write byte-compiled
Trent Nelson <trent@trent.me>
parents:
79652
diff
changeset
|
1103 _verbose_message('could not create {!r}: {!r}', path, exc) |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1104 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1105 |
|
76548
a2cf07135e4f
Issue #14605: Rename _SourcelessFileLoader to SourcelessFileLoader.
Marc-Andre Lemburg <mal@egenix.com>
parents:
76547
diff
changeset
|
1106 class SourcelessFileLoader(FileLoader, _LoaderBasics): |
|
55355
dfaf6de2c8ce
Implement the PEP 302 protocol for get_filename() as
Brett Cannon <bcannon@gmail.com>
parents:
52633
diff
changeset
|
1107 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1108 """Loader which handles sourceless file imports.""" |
|
52112
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
1109 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1110 def init_module_attrs(self, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1111 super().init_module_attrs(module) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1112 module.__cached__ = module.__file__ |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1113 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1114 def get_code(self, fullname): |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1115 path = self.get_filename(fullname) |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1116 data = self.get_data(path) |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1117 bytes_data = _validate_bytecode_header(data, name=fullname, path=path) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1118 return _compile_bytecode(bytes_data, name=fullname, bytecode_path=path) |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1119 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1120 def get_source(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1121 """Return None as there is no source code.""" |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1122 return None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1123 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1124 |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1125 # Filled in by _setup(). |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1126 EXTENSION_SUFFIXES = [] |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1127 |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1128 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1129 class ExtensionFileLoader: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1130 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1131 """Loader for extension modules. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1132 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1133 The constructor is designed to work with FileFinder. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1134 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1135 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1136 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1137 def __init__(self, name, path): |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1138 self.name = name |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1139 self.path = path |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1140 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1141 @_check_name |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1142 @set_package |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1143 @set_loader |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1144 def load_module(self, fullname): |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1145 """Load an extension module.""" |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
1146 with _ManageReload(fullname): |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1147 module = _call_with_frames_removed(_imp.load_dynamic, |
|
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1148 fullname, self.path) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1149 _verbose_message('extension module loaded from {!r}', self.path) |
|
78511
34d5ec8a1019
Don't overwrite a __path__ value from extension modules if already
Brett Cannon <brett@python.org>
parents:
78491
diff
changeset
|
1150 if self.is_package(fullname) and not hasattr(module, '__path__'): |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1151 module.__path__ = [_path_split(self.path)[0]] |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
1152 return module |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1153 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1154 def is_package(self, fullname): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
1155 """Return True if the extension module is a package.""" |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1156 file_name = _path_split(self.path)[1] |
|
78487
e024f6ba5ed8
update docstring per the extension package fix, refactor
Philip Jenvey <pjenvey@underboss.org>
parents:
78486
diff
changeset
|
1157 return any(file_name == '__init__' + suffix |
|
e024f6ba5ed8
update docstring per the extension package fix, refactor
Philip Jenvey <pjenvey@underboss.org>
parents:
78486
diff
changeset
|
1158 for suffix in EXTENSION_SUFFIXES) |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1159 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1160 def get_code(self, fullname): |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1161 """Return None as an extension module cannot create a code object.""" |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1162 return None |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1163 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1164 def get_source(self, fullname): |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1165 """Return None as extension modules have no source code.""" |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1166 return None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1167 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1168 |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1169 class _NamespacePath: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1170 """Represents a namespace package's path. It uses the module name |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1171 to find its parent module, and from there it looks up the parent's |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1172 __path__. When this changes, the module's own path is recomputed, |
| 80409 | 1173 using path_finder. For top-level modules, the parent module's path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1174 is sys.path.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1175 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1176 def __init__(self, name, path, path_finder): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1177 self._name = name |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1178 self._path = path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1179 self._last_parent_path = tuple(self._get_parent_path()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1180 self._path_finder = path_finder |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1181 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1182 def _find_parent_path_names(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1183 """Returns a tuple of (parent-module-name, parent-path-attr-name)""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1184 parent, dot, me = self._name.rpartition('.') |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1185 if dot == '': |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1186 # This is a top-level module. sys.path contains the parent path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1187 return 'sys', 'path' |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1188 # Not a top-level module. parent-module.__path__ contains the |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1189 # parent path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1190 return parent, '__path__' |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1191 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1192 def _get_parent_path(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1193 parent_module_name, path_attr_name = self._find_parent_path_names() |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1194 return getattr(sys.modules[parent_module_name], path_attr_name) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1195 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1196 def _recalculate(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1197 # If the parent's path has changed, recalculate _path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1198 parent_path = tuple(self._get_parent_path()) # Make a copy |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1199 if parent_path != self._last_parent_path: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1200 loader, new_path = self._path_finder(self._name, parent_path) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1201 # Note that no changes are made if a loader is returned, but we |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1202 # do remember the new parent path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1203 if loader is None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1204 self._path = new_path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1205 self._last_parent_path = parent_path # Save the copy |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1206 return self._path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1207 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1208 def __iter__(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1209 return iter(self._recalculate()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1210 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1211 def __len__(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1212 return len(self._recalculate()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1213 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1214 def __repr__(self): |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1215 return "_NamespacePath({!r})".format(self._path) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1216 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1217 def __contains__(self, item): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1218 return item in self._recalculate() |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1219 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1220 def append(self, item): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1221 self._path.append(item) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1222 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1223 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1224 class NamespaceLoader: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1225 def __init__(self, name, path, path_finder): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1226 self._path = _NamespacePath(name, path, path_finder) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1227 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1228 @classmethod |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1229 def module_repr(cls, module): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1230 return "<module '{}' (namespace)>".format(module.__name__) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1231 |
|
84169
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1232 def is_package(self, fullname): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1233 return True |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1234 |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1235 def get_source(self, fullname): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1236 return '' |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1237 |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1238 def get_code(self, fullname): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1239 return compile('', '<string>', 'exec', dont_inherit=True) |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1240 |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1241 def init_module_attrs(self, module): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1242 module.__loader__ = self |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1243 module.__package__ = module.__name__ |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1244 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1245 def load_module(self, fullname): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1246 """Load a namespace module.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1247 _verbose_message('namespace module loaded with path {!r}', self._path) |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1248 with module_to_load(fullname) as module: |
|
84169
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1249 self.init_module_attrs(module) |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1250 module.__path__ = self._path |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1251 return module |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1252 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1253 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1254 # Finders ##################################################################### |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1255 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1256 class PathFinder: |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1257 |
|
78382
1f8351cf00f3
Issue #15502: Bring the importlib.PathFinder docs and docstring more in line with the new import system documentation, and fix various parts of the new docs that weren't quite right given PEP 420 or were otherwise a bit misleading. Also note the key terminology problem still being discussed in the issue
Nick Coghlan <ncoghlan@gmail.com>
parents:
78380
diff
changeset
|
1258 """Meta path finder for sys.path and package __path__ attributes.""" |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1259 |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1260 @classmethod |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1261 def invalidate_caches(cls): |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1262 """Call the invalidate_caches() method on all path entry finders |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1263 stored in sys.path_importer_caches (where implemented).""" |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1264 for finder in sys.path_importer_cache.values(): |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1265 if hasattr(finder, 'invalidate_caches'): |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1266 finder.invalidate_caches() |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1267 |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1268 @classmethod |
|
76566
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
76549
diff
changeset
|
1269 def _path_hooks(cls, path): |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1270 """Search sequence of hooks for a finder for 'path'. |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1271 |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1272 If 'hooks' is false then use sys.path_hooks. |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1273 |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1274 """ |
|
76566
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
76549
diff
changeset
|
1275 if not sys.path_hooks: |
|
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
76549
diff
changeset
|
1276 _warnings.warn('sys.path_hooks is empty', ImportWarning) |
|
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
76549
diff
changeset
|
1277 for hook in sys.path_hooks: |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1278 try: |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1279 return hook(path) |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1280 except ImportError: |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1281 continue |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1282 else: |
|
76582
7025ee00dbf6
Issue #14605: Use None in sys.path_importer_cache to represent no
Brett Cannon <brett@python.org>
parents:
76579
diff
changeset
|
1283 return None |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1284 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1285 @classmethod |
|
76566
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
76549
diff
changeset
|
1286 def _path_importer_cache(cls, path): |
|
78382
1f8351cf00f3
Issue #15502: Bring the importlib.PathFinder docs and docstring more in line with the new import system documentation, and fix various parts of the new docs that weren't quite right given PEP 420 or were otherwise a bit misleading. Also note the key terminology problem still being discussed in the issue
Nick Coghlan <ncoghlan@gmail.com>
parents:
78380
diff
changeset
|
1287 """Get the finder for the path entry from sys.path_importer_cache. |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1288 |
|
78382
1f8351cf00f3
Issue #15502: Bring the importlib.PathFinder docs and docstring more in line with the new import system documentation, and fix various parts of the new docs that weren't quite right given PEP 420 or were otherwise a bit misleading. Also note the key terminology problem still being discussed in the issue
Nick Coghlan <ncoghlan@gmail.com>
parents:
78380
diff
changeset
|
1289 If the path entry is not in the cache, find the appropriate finder |
|
1f8351cf00f3
Issue #15502: Bring the importlib.PathFinder docs and docstring more in line with the new import system documentation, and fix various parts of the new docs that weren't quite right given PEP 420 or were otherwise a bit misleading. Also note the key terminology problem still being discussed in the issue
Nick Coghlan <ncoghlan@gmail.com>
parents:
78380
diff
changeset
|
1290 and cache it. If no finder is available, store None. |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1291 |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1292 """ |
|
74994
b8593ec7e8c5
Tweak the handling of the empty string in sys.path for importlib.
Brett Cannon <brett@python.org>
parents:
74992
diff
changeset
|
1293 if path == '': |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1294 path = '.' |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1295 try: |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1296 finder = sys.path_importer_cache[path] |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1297 except KeyError: |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1298 finder = cls._path_hooks(path) |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1299 sys.path_importer_cache[path] = finder |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1300 return finder |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1301 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1302 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1303 def _get_loader(cls, fullname, path): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1304 """Find the loader or namespace_path for this module/package name.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1305 # If this ends up being a namespace package, namespace_path is |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1306 # the list of paths that will become its __path__ |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1307 namespace_path = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1308 for entry in path: |
|
80529
291406748217
- Issue #16514: Fix regression causing a traceback when sys.path[0] is None
Barry Warsaw <barry@python.org>
parents:
80409
diff
changeset
|
1309 if not isinstance(entry, (str, bytes)): |
|
291406748217
- Issue #16514: Fix regression causing a traceback when sys.path[0] is None
Barry Warsaw <barry@python.org>
parents:
80409
diff
changeset
|
1310 continue |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1311 finder = cls._path_importer_cache(entry) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1312 if finder is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1313 if hasattr(finder, 'find_loader'): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1314 loader, portions = finder.find_loader(fullname) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1315 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1316 loader = finder.find_module(fullname) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1317 portions = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1318 if loader is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1319 # We found a loader: return it immediately. |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1320 return loader, namespace_path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1321 # This is possibly part of a namespace package. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1322 # Remember these path entries (if any) for when we |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1323 # create a namespace package, and continue iterating |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1324 # on path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1325 namespace_path.extend(portions) |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1326 else: |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1327 return None, namespace_path |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1328 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1329 @classmethod |
|
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1330 def find_module(cls, fullname, path=None): |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
1331 """Find the module on sys.path or 'path' based on sys.path_hooks and |
|
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
1332 sys.path_importer_cache.""" |
|
76384
c1399cf7bd6a
Issue #12599: Be more strict in accepting None vs. a false-like object
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
1333 if path is None: |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1334 path = sys.path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1335 loader, namespace_path = cls._get_loader(fullname, path) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1336 if loader is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1337 return loader |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1338 else: |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1339 if namespace_path: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1340 # We found at least one namespace path. Return a |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1341 # loader which can create the namespace package. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1342 return NamespaceLoader(fullname, namespace_path, cls._get_loader) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1343 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1344 return None |
|
51266
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1345 |
|
63386ae77f79
To prevent another screw-up on my part where my prototype gets lost thanks to
Brett Cannon <bcannon@gmail.com>
parents:
51242
diff
changeset
|
1346 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1347 class FileFinder: |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1348 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1349 """File-based finder. |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1350 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1351 Interactions with the file system are cached for performance, being |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1352 refreshed when the directory the finder is handling has been modified. |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1353 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1354 """ |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1355 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1356 def __init__(self, path, *details): |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1357 """Initialize with the path to search on and a variable number of |
|
82236
0f65bf6063ca
Fixes a FileFinder docstring to reflect an old change.
Eric Snow <ericsnowcurrently@gmail.com>
parents:
81884
diff
changeset
|
1358 2-tuples containing the loader and the file suffixes the loader |
|
0f65bf6063ca
Fixes a FileFinder docstring to reflect an old change.
Eric Snow <ericsnowcurrently@gmail.com>
parents:
81884
diff
changeset
|
1359 recognizes.""" |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1360 loaders = [] |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1361 for loader, suffixes in details: |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1362 loaders.extend((suffix, loader) for suffix in suffixes) |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1363 self._loaders = loaders |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1364 # Base (directory) path |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1365 self.path = path or '.' |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1366 self._path_mtime = -1 |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1367 self._path_cache = set() |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1368 self._relaxed_path_cache = set() |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1369 |
|
75324
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1370 def invalidate_caches(self): |
|
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1371 """Invalidate the directory mtime.""" |
|
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1372 self._path_mtime = -1 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1373 |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
1374 find_module = _find_module_shim |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1375 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1376 def find_loader(self, fullname): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1377 """Try to find a loader for the specified module, or the namespace |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1378 package portions. Returns (loader, list-of-portions).""" |
|
77757
2051fead1933
Fixes issue 15039: namespace packages are no longer imported in preference to modules of the same name.
Eric V. Smith <eric@trueblade.com>
parents:
77600
diff
changeset
|
1379 is_namespace = False |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1380 tail_module = fullname.rpartition('.')[2] |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1381 try: |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1382 mtime = _os.stat(self.path).st_mtime |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1383 except OSError: |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1384 mtime = -1 |
|
75324
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1385 if mtime != self._path_mtime: |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1386 self._fill_cache() |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1387 self._path_mtime = mtime |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1388 # tail_module keeps the original casing, for __file__ and friends |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1389 if _relax_case(): |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1390 cache = self._relaxed_path_cache |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1391 cache_module = tail_module.lower() |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1392 else: |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1393 cache = self._path_cache |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1394 cache_module = tail_module |
| 76309 | 1395 # Check if the module is the name of a directory (and thus a package). |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1396 if cache_module in cache: |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1397 base_path = _path_join(self.path, tail_module) |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1398 if _path_isdir(base_path): |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1399 for suffix, loader in self._loaders: |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1400 init_filename = '__init__' + suffix |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1401 full_path = _path_join(base_path, init_filename) |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1402 if _path_isfile(full_path): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1403 return (loader(fullname, full_path), [base_path]) |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1404 else: |
|
77757
2051fead1933
Fixes issue 15039: namespace packages are no longer imported in preference to modules of the same name.
Eric V. Smith <eric@trueblade.com>
parents:
77600
diff
changeset
|
1405 # A namespace package, return the path if we don't also |
|
2051fead1933
Fixes issue 15039: namespace packages are no longer imported in preference to modules of the same name.
Eric V. Smith <eric@trueblade.com>
parents:
77600
diff
changeset
|
1406 # find a module in the next section. |
|
2051fead1933
Fixes issue 15039: namespace packages are no longer imported in preference to modules of the same name.
Eric V. Smith <eric@trueblade.com>
parents:
77600
diff
changeset
|
1407 is_namespace = True |
| 76309 | 1408 # Check for a file w/ a proper suffix exists. |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1409 for suffix, loader in self._loaders: |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
1410 full_path = _path_join(self.path, tail_module + suffix) |
|
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
1411 _verbose_message('trying {}'.format(full_path), verbosity=2) |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1412 if cache_module + suffix in cache: |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1413 if _path_isfile(full_path): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1414 return (loader(fullname, full_path), []) |
|
77757
2051fead1933
Fixes issue 15039: namespace packages are no longer imported in preference to modules of the same name.
Eric V. Smith <eric@trueblade.com>
parents:
77600
diff
changeset
|
1415 if is_namespace: |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
1416 _verbose_message('possible namespace for {}'.format(base_path)) |
|
77757
2051fead1933
Fixes issue 15039: namespace packages are no longer imported in preference to modules of the same name.
Eric V. Smith <eric@trueblade.com>
parents:
77600
diff
changeset
|
1417 return (None, [base_path]) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1418 return (None, []) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1419 |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1420 def _fill_cache(self): |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1421 """Fill the cache of potential modules and packages for this directory.""" |
|
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1422 path = self.path |
|
78663
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1423 try: |
|
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1424 contents = _os.listdir(path) |
|
81427
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1425 except (FileNotFoundError, PermissionError, NotADirectoryError): |
|
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1426 # Directory has either been removed, turned into a file, or made |
|
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1427 # unreadable. |
|
78663
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1428 contents = [] |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1429 # We store two cached versions, to handle runtime changes of the |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1430 # PYTHONCASEOK environment variable. |
|
76428
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1431 if not sys.platform.startswith('win'): |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1432 self._path_cache = set(contents) |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1433 else: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1434 # Windows users can import modules with case-insensitive file |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1435 # suffixes (for legacy reasons). Make the suffix lowercase here |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1436 # so it's done once instead of for every import. This is safe as |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1437 # the specified suffixes to check against are always specified in a |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1438 # case-sensitive manner. |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1439 lower_suffix_contents = set() |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1440 for item in contents: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1441 name, dot, suffix = item.partition('.') |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1442 if dot: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1443 new_name = '{}.{}'.format(name, suffix.lower()) |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1444 else: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1445 new_name = name |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1446 lower_suffix_contents.add(new_name) |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1447 self._path_cache = lower_suffix_contents |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1448 if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
1449 self._relaxed_path_cache = {fn.lower() for fn in contents} |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1450 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1451 @classmethod |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1452 def path_hook(cls, *loader_details): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1453 """A class method which returns a closure to use on sys.path_hook |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1454 which will return an instance using the specified loaders and the path |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1455 called on the closure. |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1456 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1457 If the path called on the closure is not a directory, ImportError is |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1458 raised. |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1459 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1460 """ |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1461 def path_hook_for_FileFinder(path): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1462 """Path hook for importlib.machinery.FileFinder.""" |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1463 if not _path_isdir(path): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1464 raise ImportError("only directories are supported", path=path) |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1465 return cls(path, *loader_details) |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1466 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1467 return path_hook_for_FileFinder |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1468 |
|
77600
df856963fc6c
A better repr() for FileFinder
Antoine Pitrou <solipsis@pitrou.net>
parents:
77457
diff
changeset
|
1469 def __repr__(self): |
|
79692
987a8724b220
Remove uses of % with str.format.
Brett Cannon <brett@python.org>
parents:
79653
diff
changeset
|
1470 return "FileFinder({!r})".format(self.path) |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1471 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1472 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
1473 # Import itself ############################################################### |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
1474 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1475 class _ImportLockContext: |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1476 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1477 """Context manager for the import lock.""" |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1478 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1479 def __enter__(self): |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1480 """Acquire the import lock.""" |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1481 _imp.acquire_lock() |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1482 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1483 def __exit__(self, exc_type, exc_value, exc_traceback): |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1484 """Release the import lock regardless of any raised exceptions.""" |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1485 _imp.release_lock() |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1486 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1487 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1488 def _resolve_name(name, package, level): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1489 """Resolve a relative module name to an absolute one.""" |
|
75250
8840037a9c53
unused imports, pep8
Philip Jenvey <pjenvey@underboss.org>
parents:
75239
diff
changeset
|
1490 bits = package.rsplit('.', level - 1) |
|
75239
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1491 if len(bits) < level: |
|
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1492 raise ValueError('attempted relative import beyond top-level package') |
|
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1493 base = bits[0] |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1494 return '{}.{}'.format(base, name) if name else base |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1495 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1496 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1497 def _find_module(name, path): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1498 """Find a module's loader.""" |
|
76579
3bd60cc27664
Issue #14605: Stop having implicit entries for sys.meta_path.
Brett Cannon <brett@python.org>
parents:
76566
diff
changeset
|
1499 if not sys.meta_path: |
|
3bd60cc27664
Issue #14605: Stop having implicit entries for sys.meta_path.
Brett Cannon <brett@python.org>
parents:
76566
diff
changeset
|
1500 _warnings.warn('sys.meta_path is empty', ImportWarning) |
|
3bd60cc27664
Issue #14605: Stop having implicit entries for sys.meta_path.
Brett Cannon <brett@python.org>
parents:
76566
diff
changeset
|
1501 for finder in sys.meta_path: |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1502 with _ImportLockContext(): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1503 loader = finder.find_module(name, path) |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1504 if loader is not None: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1505 # The parent import may have already imported this module. |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1506 if name not in sys.modules: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1507 return loader |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1508 else: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1509 return sys.modules[name].__loader__ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1510 else: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1511 return None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1512 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1513 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1514 def _sanity_check(name, package, level): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1515 """Verify arguments are "sane".""" |
|
75228
909935a236e3
Do a type check instead of an interface check.
Brett Cannon <brett@python.org>
parents:
75193
diff
changeset
|
1516 if not isinstance(name, str): |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1517 raise TypeError("module name must be str, not {}".format(type(name))) |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1518 if level < 0: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1519 raise ValueError('level must be >= 0') |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1520 if package: |
|
75228
909935a236e3
Do a type check instead of an interface check.
Brett Cannon <brett@python.org>
parents:
75193
diff
changeset
|
1521 if not isinstance(package, str): |
|
75229
8d1040fdac60
Improper type for __package__ should raise TypeError, not ValueError.
Brett Cannon <brett@python.org>
parents:
75228
diff
changeset
|
1522 raise TypeError("__package__ not set to a string") |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1523 elif package not in sys.modules: |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1524 msg = ("Parent module {!r} not loaded, cannot perform relative " |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1525 "import") |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1526 raise SystemError(msg.format(package)) |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1527 if not name and level == 0: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1528 raise ValueError("Empty module name") |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1529 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1530 |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1531 _ERR_MSG = 'No module named {!r}' |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1532 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1533 def _find_and_load_unlocked(name, import_): |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1534 path = None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1535 parent = name.rpartition('.')[0] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1536 if parent: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1537 if parent not in sys.modules: |
|
78344
62033490ca0f
Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
Nick Coghlan <ncoghlan@gmail.com>
parents:
78314
diff
changeset
|
1538 _call_with_frames_removed(import_, parent) |
|
76081
a40cd5976215
If a module injects something into sys.modules as a side-effect of
Brett Cannon <brett@python.org>
parents:
75463
diff
changeset
|
1539 # Crazy side-effects! |
|
a40cd5976215
If a module injects something into sys.modules as a side-effect of
Brett Cannon <brett@python.org>
parents:
75463
diff
changeset
|
1540 if name in sys.modules: |
|
a40cd5976215
If a module injects something into sys.modules as a side-effect of
Brett Cannon <brett@python.org>
parents:
75463
diff
changeset
|
1541 return sys.modules[name] |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1542 # Backwards-compatibility; be nicer to skip the dict lookup. |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1543 parent_module = sys.modules[parent] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1544 try: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1545 path = parent_module.__path__ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1546 except AttributeError: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1547 msg = (_ERR_MSG + '; {} is not a package').format(name, parent) |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
1548 raise ImportError(msg, name=name) |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1549 loader = _find_module(name, path) |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1550 if loader is None: |
|
84103
8a0ed9f63c6e
Issue #15767: Introduce ModuleNotFoundError, a subclass of
Brett Cannon <brett@python.org>
parents:
84091
diff
changeset
|
1551 raise ModuleNotFoundError(_ERR_MSG.format(name), name=name) |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1552 elif name not in sys.modules: |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1553 # The parent import may have already imported this module. |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1554 loader.load_module(name) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1555 _verbose_message('import {!r} # {!r}', name, loader) |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1556 # Backwards-compatibility; be nicer to skip the dict lookup. |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1557 module = sys.modules[name] |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1558 if parent: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1559 # Set the module as an attribute on its parent. |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1560 parent_module = sys.modules[parent] |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1561 setattr(parent_module, name.rpartition('.')[2], module) |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1562 # Set __package__ if the loader did not. |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1563 if getattr(module, '__package__', None) is None: |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1564 try: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1565 module.__package__ = module.__name__ |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1566 if not hasattr(module, '__path__'): |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1567 module.__package__ = module.__package__.rpartition('.')[0] |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1568 except AttributeError: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1569 pass |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1570 # Set loader if need be. |
|
82643
7647aae9481c
Issue #17117: Have both import itself and importlib.util.set_loader()
Brett Cannon <brett@python.org>
parents:
82385
diff
changeset
|
1571 if getattr(module, '__loader__', None) is None: |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1572 try: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1573 module.__loader__ = loader |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1574 except AttributeError: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1575 pass |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1576 return module |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1577 |
|
66226
af13fb6fb3df
Fix a minor inconsistency in capitalization for the 'No module named' exception
Brett Cannon <bcannon@gmail.com>
parents:
64407
diff
changeset
|
1578 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1579 def _find_and_load(name, import_): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1580 """Find and load the module, and release the import lock.""" |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1581 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1582 lock = _get_module_lock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1583 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1584 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1585 lock.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1586 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1587 return _find_and_load_unlocked(name, import_) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1588 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1589 lock.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1590 |
|
66226
af13fb6fb3df
Fix a minor inconsistency in capitalization for the 'No module named' exception
Brett Cannon <bcannon@gmail.com>
parents:
64407
diff
changeset
|
1591 |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1592 def _gcd_import(name, package=None, level=0): |
|
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1593 """Import and return the module based on its name, the package the call is |
|
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1594 being made from, and the level adjustment. |
|
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1595 |
|
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1596 This function represents the greatest common denominator of functionality |
| 68447 | 1597 between import_module and __import__. This includes setting __package__ if |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1598 the loader did not. |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1599 |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1600 """ |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1601 _sanity_check(name, package, level) |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1602 if level > 0: |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1603 name = _resolve_name(name, package, level) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1604 _imp.acquire_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1605 if name not in sys.modules: |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1606 return _find_and_load(name, _gcd_import) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1607 module = sys.modules[name] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1608 if module is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1609 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1610 message = ("import of {} halted; " |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1611 "None in sys.modules".format(name)) |
|
84109
3a50025f1900
Issue #15767: Touch up ModuleNotFoundError usage by import.
Brett Cannon <brett@python.org>
parents:
84103
diff
changeset
|
1612 raise ModuleNotFoundError(message, name=name) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1613 _lock_unlock_module(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1614 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1615 |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1616 def _handle_fromlist(module, fromlist, import_): |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1617 """Figure out what __import__ should return. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1618 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1619 The import_ parameter is a callable which takes the name of module to |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1620 import. It is required to decouple the function from assuming importlib's |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1621 import implementation is desired. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1622 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1623 """ |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1624 # The hell that is fromlist ... |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1625 # If a package was imported, try to import stuff from fromlist. |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1626 if hasattr(module, '__path__'): |
|
78051
dc18a2a66d16
Issue #15111: When a module was imported using a 'from import'
Brett Cannon <brett@python.org>
parents:
78042
diff
changeset
|
1627 if '*' in fromlist: |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1628 fromlist = list(fromlist) |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1629 fromlist.remove('*') |
|
78051
dc18a2a66d16
Issue #15111: When a module was imported using a 'from import'
Brett Cannon <brett@python.org>
parents:
78042
diff
changeset
|
1630 if hasattr(module, '__all__'): |
|
dc18a2a66d16
Issue #15111: When a module was imported using a 'from import'
Brett Cannon <brett@python.org>
parents:
78042
diff
changeset
|
1631 fromlist.extend(module.__all__) |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1632 for x in fromlist: |
|
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1633 if not hasattr(module, x): |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1634 from_name = '{}.{}'.format(module.__name__, x) |
|
78619
0d52f125dd32
Issue #15715: Ignore failed imports triggered by the use of fromlist.
Brett Cannon <brett@python.org>
parents:
78511
diff
changeset
|
1635 try: |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1636 _call_with_frames_removed(import_, from_name) |
|
84103
8a0ed9f63c6e
Issue #15767: Introduce ModuleNotFoundError, a subclass of
Brett Cannon <brett@python.org>
parents:
84091
diff
changeset
|
1637 except ModuleNotFoundError as exc: |
|
78619
0d52f125dd32
Issue #15715: Ignore failed imports triggered by the use of fromlist.
Brett Cannon <brett@python.org>
parents:
78511
diff
changeset
|
1638 # Backwards-compatibility dictates we ignore failed |
|
78758
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1639 # imports triggered by fromlist for modules that don't |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1640 # exist. |
|
84103
8a0ed9f63c6e
Issue #15767: Introduce ModuleNotFoundError, a subclass of
Brett Cannon <brett@python.org>
parents:
84091
diff
changeset
|
1641 if exc.name == from_name: |
|
8a0ed9f63c6e
Issue #15767: Introduce ModuleNotFoundError, a subclass of
Brett Cannon <brett@python.org>
parents:
84091
diff
changeset
|
1642 continue |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1643 raise |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1644 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1645 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1646 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1647 def _calc___package__(globals): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1648 """Calculate what __package__ should be. |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1649 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1650 __package__ is not guaranteed to be defined or could be set to None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1651 to represent that its proper value is unknown. |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1652 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1653 """ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1654 package = globals.get('__package__') |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1655 if package is None: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1656 package = globals['__name__'] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1657 if '__path__' not in globals: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1658 package = package.rpartition('.')[0] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1659 return package |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1660 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1661 |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1662 def _get_supported_file_loaders(): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1663 """Returns a list of file-based module loaders. |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1664 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1665 Each item is a tuple (loader, suffixes, allow_packages). |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1666 """ |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1667 extensions = ExtensionFileLoader, _imp.extension_suffixes() |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1668 source = SourceFileLoader, SOURCE_SUFFIXES |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1669 bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1670 return [extensions, source, bytecode] |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1671 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1672 |
|
78456
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1673 def __import__(name, globals=None, locals=None, fromlist=(), level=0): |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1674 """Import a module. |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1675 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1676 The 'globals' argument is used to infer where the import is occuring from |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1677 to handle relative imports. The 'locals' argument is ignored. The |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1678 'fromlist' argument specifies what should exist as attributes on the module |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1679 being imported (e.g. ``from module import <fromlist>``). The 'level' |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1680 argument represents the package location to import from in a relative |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1681 import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1682 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1683 """ |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1684 if level == 0: |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1685 module = _gcd_import(name) |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1686 else: |
|
78456
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1687 globals_ = globals if globals is not None else {} |
|
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1688 package = _calc___package__(globals_) |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1689 module = _gcd_import(name, package, level) |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1690 if not fromlist: |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1691 # Return up to the first dot in 'name'. This is complicated by the fact |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1692 # that 'name' may be relative. |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1693 if level == 0: |
|
76826
d6324941b739
Issue #14583: Fix importlib bug when a package's __init__.py would first import one of its modules then raise an error.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76765
diff
changeset
|
1694 return _gcd_import(name.partition('.')[0]) |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1695 elif not name: |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1696 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1697 else: |
| 79228 | 1698 # Figure out where to slice the module's name up to the first dot |
| 1699 # in 'name'. | |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1700 cut_off = len(name) - len(name.partition('.')[0]) |
| 79228 | 1701 # Slice end needs to be positive to alleviate need to special-case |
| 1702 # when ``'.' not in name``. | |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76309
diff
changeset
|
1703 return sys.modules[module.__name__[:len(module.__name__)-cut_off]] |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1704 else: |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1705 return _handle_fromlist(module, fromlist, _gcd_import) |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1706 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1707 |
|
76445
c820aa9c0c00
Issue #13959: Keep imp.get_magic() in C code, but cache in importlib
Brett Cannon <brett@python.org>
parents:
76428
diff
changeset
|
1708 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1709 def _setup(sys_module, _imp_module): |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1710 """Setup importlib by importing needed built-in modules and injecting them |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1711 into the global namespace. |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1712 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1713 As sys is needed for sys.modules access and _imp is needed to load built-in |
|
74935
81f3bb5efa40
Bring importlib in line w/ changes made in my personal bootstrap branch in the sandbox.
Brett Cannon <brett@python.org>
parents:
74867
diff
changeset
|
1714 modules, those two modules must be explicitly passed in. |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1715 |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1716 """ |
|
79173
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
1717 global _imp, sys, BYTECODE_SUFFIXES |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1718 _imp = _imp_module |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1719 sys = sys_module |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1720 |
|
79173
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
1721 if sys.flags.optimize: |
|
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
1722 BYTECODE_SUFFIXES = OPTIMIZED_BYTECODE_SUFFIXES |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1723 else: |
|
79173
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
1724 BYTECODE_SUFFIXES = DEBUG_BYTECODE_SUFFIXES |
|
4de5e4ec3cff
don't depend on __debug__ because it's baked in at freeze time (issue #16046)
Benjamin Peterson <benjamin@python.org>
parents:
78779
diff
changeset
|
1725 |
|
81869
05747d3bcd9c
Issue #17098: Make sure every module has __loader__ defined.
Brett Cannon <brett@python.org>
parents:
81427
diff
changeset
|
1726 module_type = type(sys) |
|
81884
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1727 for name, module in sys.modules.items(): |
|
81869
05747d3bcd9c
Issue #17098: Make sure every module has __loader__ defined.
Brett Cannon <brett@python.org>
parents:
81427
diff
changeset
|
1728 if isinstance(module, module_type): |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
83572
diff
changeset
|
1729 if getattr(module, '__loader__', None) is None: |
|
81884
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1730 if name in sys.builtin_module_names: |
|
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1731 module.__loader__ = BuiltinImporter |
|
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1732 elif _imp.is_frozen(name): |
|
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1733 module.__loader__ = FrozenImporter |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1734 |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1735 self_module = sys.modules[__name__] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1736 for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'): |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1737 if builtin_name not in sys.modules: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1738 builtin_module = BuiltinImporter.load_module(builtin_name) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1739 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1740 builtin_module = sys.modules[builtin_name] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1741 setattr(self_module, builtin_name, builtin_module) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1742 |
|
79480
15949f34e08f
#16135: Removal of OS/2 support (Python code partial cleanup)
Jesus Cea <jcea@jcea.es>
parents:
79228
diff
changeset
|
1743 os_details = ('posix', ['/']), ('nt', ['\\', '/']) |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
1744 for builtin_os, path_separators in os_details: |
|
76472
4e853913054c
Issue #13959: Continue to try to accomodate altsep in importlib by not
Brett Cannon <brett@python.org>
parents:
76466
diff
changeset
|
1745 # Assumption made in _path_join() |
|
4e853913054c
Issue #13959: Continue to try to accomodate altsep in importlib by not
Brett Cannon <brett@python.org>
parents:
76466
diff
changeset
|
1746 assert all(len(sep) == 1 for sep in path_separators) |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
1747 path_sep = path_separators[0] |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1748 if builtin_os in sys.modules: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1749 os_module = sys.modules[builtin_os] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1750 break |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1751 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1752 try: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1753 os_module = BuiltinImporter.load_module(builtin_os) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1754 break |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1755 except ImportError: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1756 continue |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1757 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1758 raise ImportError('importlib requires posix or nt') |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1759 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1760 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1761 thread_module = BuiltinImporter.load_module('_thread') |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1762 except ImportError: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1763 # Python was built without threads |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1764 thread_module = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1765 weakref_module = BuiltinImporter.load_module('_weakref') |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1766 |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1767 if builtin_os == 'nt': |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1768 winreg_module = BuiltinImporter.load_module('winreg') |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1769 setattr(self_module, '_winreg', winreg_module) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1770 |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1771 setattr(self_module, '_os', os_module) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1772 setattr(self_module, '_thread', thread_module) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1773 setattr(self_module, '_weakref', weakref_module) |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1774 setattr(self_module, 'path_sep', path_sep) |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
1775 setattr(self_module, 'path_separators', ''.join(path_separators)) |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1776 # Constants |
|
75055
b8576719fe71
_relax_case -> _make_relax_case
Antoine Pitrou <solipsis@pitrou.net>
parents:
75048
diff
changeset
|
1777 setattr(self_module, '_relax_case', _make_relax_case()) |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1778 EXTENSION_SUFFIXES.extend(_imp.extension_suffixes()) |
|
76451
ea46ebba8a0f
Issue #13959: Re-implement imp.source_from_cache() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76450
diff
changeset
|
1779 if builtin_os == 'nt': |
|
76874
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
1780 SOURCE_SUFFIXES.append('.pyw') |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1781 if '_d.pyd' in EXTENSION_SUFFIXES: |
|
78380
a1ac1e13c5a0
Close #15519: Properly expose WindowsRegistryFinder in importlib and bring the name into line with normal import terminology. Original patch by Eric Snow
Nick Coghlan <ncoghlan@gmail.com>
parents:
78344
diff
changeset
|
1782 WindowsRegistryFinder.DEBUG_BUILD = True |
|
75000
e477832212b9
Optimize importlib's case-sensitivity check by wasting as little time as possible under case-sensitive OSs.
Brett Cannon <brett@python.org>
parents:
74998
diff
changeset
|
1783 |
|
74935
81f3bb5efa40
Bring importlib in line w/ changes made in my personal bootstrap branch in the sandbox.
Brett Cannon <brett@python.org>
parents:
74867
diff
changeset
|
1784 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1785 def _install(sys_module, _imp_module): |
| 76765 | 1786 """Install importlib as the implementation of import.""" |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1787 _setup(sys_module, _imp_module) |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1788 supported_loaders = _get_supported_file_loaders() |
|
76582
7025ee00dbf6
Issue #14605: Use None in sys.path_importer_cache to represent no
Brett Cannon <brett@python.org>
parents:
76579
diff
changeset
|
1789 sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1790 sys.meta_path.append(BuiltinImporter) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1791 sys.meta_path.append(FrozenImporter) |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1792 if _os.__name__ == 'nt': |
|
78380
a1ac1e13c5a0
Close #15519: Properly expose WindowsRegistryFinder in importlib and bring the name into line with normal import terminology. Original patch by Eric Snow
Nick Coghlan <ncoghlan@gmail.com>
parents:
78344
diff
changeset
|
1793 sys.meta_path.append(WindowsRegistryFinder) |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1794 sys.meta_path.append(PathFinder) |
