Mercurial > cpython-lru_cache-weakref
annotate Lib/importlib/_bootstrap.py @ 86127:a3d09c19bb93
merge with 3.3
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Sun, 06 Oct 2013 19:24:00 +0200 |
| parents | 9354df85afd7 |
| children | 76184b5339f2 |
| 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.""" |
|
85518
7801ef4a4ce3
Issue #16826: Revert fix while Windows issues are being worked out.
Meador Inge <meadori@gmail.com>
parents:
85515
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(): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
178 raise _DeadlockError('deadlock detected by %r' % self) |
|
77013
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: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
191 raise RuntimeError('cannot release un-acquired lock') |
|
77013
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): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
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: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
218 raise RuntimeError('cannot release un-acquired lock') |
|
77013
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): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
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 |
|
84467
b8028f74bac4
Issue #18351: Fix various issues with
Brett Cannon <brett@python.org>
parents:
84174
diff
changeset
|
446 rest, _, extension = bytecode_path.rpartition('.') |
|
b8028f74bac4
Issue #18351: Fix various issues with
Brett Cannon <brett@python.org>
parents:
84174
diff
changeset
|
447 if not rest or extension.lower()[-3:-1] != 'py': |
|
78078
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 try: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
450 source_path = source_from_cache(bytecode_path) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
451 except (NotImplementedError, ValueError): |
|
84467
b8028f74bac4
Issue #18351: Fix various issues with
Brett Cannon <brett@python.org>
parents:
84174
diff
changeset
|
452 source_path = bytecode_path[:-1] |
|
b8028f74bac4
Issue #18351: Fix various issues with
Brett Cannon <brett@python.org>
parents:
84174
diff
changeset
|
453 return source_path if _path_isfile(source_path) else bytecode_path |
|
78078
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 |
|
83376
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
456 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
|
457 """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
|
458 try: |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
459 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
|
460 except OSError: |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
461 mode = 0o666 |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
462 # 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
|
463 # 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
|
464 mode |= 0o200 |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
465 return mode |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
466 |
|
04aaeae6ee7b
Issue #17244: Don't mask exceptions raised during the creation of
Brett Cannon <brett@python.org>
parents:
83225
diff
changeset
|
467 |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
468 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
|
469 """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
|
470 if sys.flags.verbose >= verbosity: |
|
76327
1ca10eb58483
utilize startswith(tuple)
Philip Jenvey <pjenvey@underboss.org>
parents:
76312
diff
changeset
|
471 if not message.startswith(('#', 'import ')): |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
472 message = '# ' + message |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
473 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
|
474 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
475 |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
476 class _ManageReload: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
477 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
478 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
|
479 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
|
480 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
481 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
|
482 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
|
483 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
484 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
|
485 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
|
486 try: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
487 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
|
488 except KeyError: |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
489 pass |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
490 |
|
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
491 |
|
83988
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
492 # 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
|
493 class _ModuleManager(_ManageReload): |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
494 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
495 """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
|
496 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
497 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
|
498 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
499 """ |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
500 |
|
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
|
501 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
|
502 """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
|
503 |
|
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 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
|
505 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
|
506 """ |
|
84171
205aa49e5cd5
Issue #18115: Abstract out managing the cleanup of modules to use in
Brett Cannon <brett@python.org>
parents:
84169
diff
changeset
|
507 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
|
508 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
|
509 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
510 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
|
511 super().__enter__() |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
512 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
|
513 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
|
514 # 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
|
515 # 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
|
516 # infinite loop. |
|
84134
9cacdb9d0c59
Issue #17907: touch up the code for imp.new_module().
Brett Cannon <brett@python.org>
parents:
84128
diff
changeset
|
517 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
|
518 # 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
|
519 # (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
|
520 self._module.__initializing__ = True |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
521 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
|
522 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
|
523 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
|
524 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
|
525 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
|
526 pass |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
527 return self._module |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
528 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
529 def __exit__(self, *args): |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
530 self._module.__initializing__ = False |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
531 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
|
532 super().__exit__(*args) |
|
83960
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
533 |
|
3a1976680717
Introduce importlib.util.ModuleManager which is a context manager to
Brett Cannon <brett@python.org>
parents:
83791
diff
changeset
|
534 |
|
83999
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
535 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
|
536 """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
|
537 |
|
130dfd6b3428
Fix for last commit on adding reset_name to module_to_load
Brett Cannon <brett@python.org>
parents:
83998
diff
changeset
|
538 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
|
539 """ |
|
83988
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
540 # 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
|
541 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
|
542 |
|
6ace4133c1c0
Rename importlib.util.ModuleManager to module_to_load so that the name
Brett Cannon <brett@python.org>
parents:
83963
diff
changeset
|
543 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
544 def _init_package_attrs(loader, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
545 """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
|
546 name = module.__name__ |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
547 try: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
548 is_package = loader.is_package(name) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
549 except ImportError: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
550 pass |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
551 else: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
552 if is_package: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
553 module.__package__ = name |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
554 module.__path__ = [] |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
555 else: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
556 module.__package__ = name.rpartition('.')[0] |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
557 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
558 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
559 def _init_file_attrs(loader, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
560 """Set __file__ and __path__ based on loader.get_filename().""" |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
561 try: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
562 module.__file__ = loader.get_filename(module.__name__) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
563 except ImportError: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
564 pass |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
565 else: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
566 if module.__name__ == module.__package__: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
567 module.__path__.append(_path_split(module.__file__)[0]) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
568 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
569 |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
570 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
|
571 """Set __package__ on the returned module.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
572 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
|
573 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
|
574 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
|
575 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
|
576 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
|
577 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
|
578 return module |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
579 _wrap(set_package_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
580 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
|
581 |
|
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
582 |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
583 def set_loader(fxn): |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
584 """Set __loader__ on the returned module.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
585 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
|
586 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
|
587 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
|
588 module.__loader__ = self |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
589 return module |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
590 _wrap(set_loader_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
591 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
|
592 |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
593 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
594 def _check_name(method): |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
595 """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
|
596 loader can handle. |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
597 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
598 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
|
599 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
|
600 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
601 """ |
| 76877 | 602 def _check_name_wrapper(self, name=None, *args, **kwargs): |
| 603 if name is None: | |
| 604 name = self.name | |
| 605 elif self.name != name: | |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
606 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
|
607 return method(self, name, *args, **kwargs) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
608 _wrap(_check_name_wrapper, method) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
609 return _check_name_wrapper |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
610 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
611 |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
612 def _requires_builtin(fxn): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
613 """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
|
614 def _requires_builtin_wrapper(self, fullname): |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
615 if fullname not in sys.builtin_module_names: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
616 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
|
617 name=fullname) |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
618 return fxn(self, fullname) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
619 _wrap(_requires_builtin_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
620 return _requires_builtin_wrapper |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
621 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
622 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
623 def _requires_frozen(fxn): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
624 """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
|
625 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
|
626 if not _imp.is_frozen(fullname): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
627 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
|
628 name=fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
629 return fxn(self, fullname) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
630 _wrap(_requires_frozen_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
631 return _requires_frozen_wrapper |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
632 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
633 |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
634 def _find_module_shim(self, fullname): |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
635 """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
|
636 self.find_loader().""" |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
637 # 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
|
638 # is a namespace package portion), generate a warning and |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
639 # return None. |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
640 loader, portions = self.find_loader(fullname) |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
641 if loader is None and len(portions): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
642 msg = 'Not importing directory {}: missing __init__' |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
643 _warnings.warn(msg.format(portions[0]), ImportWarning) |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
644 return loader |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
645 |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
646 |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
647 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
|
648 """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
|
649 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
|
650 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
651 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
|
652 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
653 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
|
654 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
|
655 truncated. |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
656 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
657 """ |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
658 exc_details = {} |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
659 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
|
660 exc_details['name'] = name |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
661 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
662 # 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
|
663 name = '<bytecode>' |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
664 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
|
665 exc_details['path'] = path |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
666 magic = data[:4] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
667 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
|
668 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
|
669 if magic != MAGIC_NUMBER: |
| 83056 | 670 message = 'bad magic number in {!r}: {!r}'.format(name, magic) |
| 671 _verbose_message(message) | |
| 672 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
|
673 elif len(raw_timestamp) != 4: |
|
84046
6b189f29b1e6
tweak exception message (again)
Brett Cannon <brett@python.org>
parents:
84023
diff
changeset
|
674 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
|
675 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
676 raise EOFError(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
677 elif len(raw_size) != 4: |
|
84046
6b189f29b1e6
tweak exception message (again)
Brett Cannon <brett@python.org>
parents:
84023
diff
changeset
|
678 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
|
679 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
680 raise EOFError(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
681 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
|
682 try: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
683 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
|
684 except KeyError: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
685 pass |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
686 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
687 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
|
688 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
|
689 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
690 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
|
691 try: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
692 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
|
693 except KeyError: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
694 pass |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
695 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
696 if _r_long(raw_size) != source_size: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
697 raise ImportError('bytecode is stale for {!r}'.format(name), |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
698 **exc_details) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
699 return data[12:] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
700 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
701 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
702 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
|
703 """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
|
704 code = marshal.loads(data) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
705 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
|
706 _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
|
707 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
|
708 _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
|
709 return code |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
710 else: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
711 raise ImportError('Non-code object in {!r}'.format(bytecode_path), |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
712 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
|
713 |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
714 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
|
715 """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
|
716 file.""" |
|
84128
5619bc2d8207
Issue #18192: Introduce importlib.util.MAGIC_NUMBER and document the
Brett Cannon <brett@python.org>
parents:
84109
diff
changeset
|
717 data = bytearray(MAGIC_NUMBER) |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
718 data.extend(_w_long(mtime)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
719 data.extend(_w_long(source_size)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
720 data.extend(marshal.dumps(code)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
721 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
|
722 |
|
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
|
723 |
|
84173
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
724 def decode_source(source_bytes): |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
725 """Decode bytes representing source code and return the string. |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
726 |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
727 Universal newline support is used in the decoding. |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
728 """ |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
729 import tokenize # To avoid bootstrap issues. |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
730 source_bytes_readline = _io.BytesIO(source_bytes).readline |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
731 encoding = tokenize.detect_encoding(source_bytes_readline) |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
732 newline_decoder = _io.IncrementalNewlineDecoder(None, True) |
|
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
733 return newline_decoder.decode(source_bytes.decode(encoding[0])) |
|
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
|
734 |
|
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
|
735 |
|
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
|
736 # Loaders ##################################################################### |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
737 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
738 class BuiltinImporter: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
739 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
740 """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
|
741 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
742 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
|
743 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
|
744 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
745 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
746 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
747 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
748 def module_repr(cls, module): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
749 return '<module {!r} (built-in)>'.format(module.__name__) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
750 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
751 @classmethod |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
752 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
|
753 """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
|
754 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
755 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
|
756 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
757 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
758 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
|
759 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
|
760 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
|
761 |
|
51026
c26f1af26bfc
Document both importlib.machinery.BuiltinImporter and FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
50983
diff
changeset
|
762 @classmethod |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
763 @set_package |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
764 @set_loader |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
765 @_requires_builtin |
|
51026
c26f1af26bfc
Document both importlib.machinery.BuiltinImporter and FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
50983
diff
changeset
|
766 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
|
767 """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
|
768 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
|
769 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
|
770 |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
771 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
772 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
773 def get_code(cls, fullname): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
774 """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
|
775 return None |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
776 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
777 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
778 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
779 def get_source(cls, fullname): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
780 """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
|
781 return None |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
782 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
783 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
784 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
785 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
|
786 """Return False as built-in modules are never packages.""" |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
787 return False |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
788 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
789 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
790 class FrozenImporter: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
791 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
792 """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
|
793 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
794 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
|
795 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
|
796 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
797 """ |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
798 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
799 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
800 def module_repr(cls, m): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
801 return '<module {!r} (frozen)>'.format(m.__name__) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
802 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
803 @classmethod |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
804 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
|
805 """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
|
806 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
|
807 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
808 @classmethod |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
809 @set_package |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
810 @set_loader |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
811 @_requires_frozen |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
812 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
|
813 """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
|
814 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
|
815 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
|
816 # 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
|
817 del m.__file__ |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
818 return m |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
819 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
820 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
821 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
822 def get_code(cls, fullname): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
823 """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
|
824 return _imp.get_frozen_object(fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
825 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
826 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
827 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
828 def get_source(cls, fullname): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
829 """Return None as frozen modules do not have source code.""" |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
830 return None |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
831 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
832 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
833 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
834 def is_package(cls, fullname): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
835 """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
|
836 return _imp.is_frozen_package(fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
837 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
838 |
|
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
|
839 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
|
840 |
|
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
|
841 """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
|
842 """ |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
843 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
844 REGISTRY_KEY = ( |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
845 'Software\\Python\\PythonCore\\{sys_version}' |
|
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
846 '\\Modules\\{fullname}') |
|
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 REGISTRY_KEY_DEBUG = ( |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
848 'Software\\Python\\PythonCore\\{sys_version}' |
|
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
849 '\\Modules\\{fullname}\\Debug') |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
850 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
|
851 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
852 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
853 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
|
854 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
855 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
|
856 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
|
857 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
|
858 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
859 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
860 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
|
861 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
|
862 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
|
863 else: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
864 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
|
865 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
|
866 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
|
867 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
868 with cls._open_registry(key) as hkey: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
869 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
|
870 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
|
871 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
|
872 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
|
873 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
874 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
875 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
|
876 """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
|
877 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
|
878 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
|
879 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
|
880 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
881 _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
|
882 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
|
883 return None |
|
85945
32b18998a560
[issue19151] Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples.
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85518
diff
changeset
|
884 for loader, suffixes in _get_supported_file_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
|
885 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
|
886 return loader(fullname, filepath) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
887 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
888 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
889 class _LoaderBasics: |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
890 |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
891 """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
|
892 SourcelessFileLoader.""" |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
893 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
894 def is_package(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
895 """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
|
896 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
|
897 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
|
898 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
|
899 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
|
900 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
|
901 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
902 def init_module_attrs(self, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
903 """Set various attributes on the module. |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
904 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
905 ExecutionLoader.init_module_attrs() is used to set __loader__, |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
906 __package__, __file__, and optionally __path__. The __cached__ attribute |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
907 is set using imp.cache_from_source() and __file__. |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
908 """ |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
909 module.__loader__ = self # Loader |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
910 _init_package_attrs(self, module) # InspectLoader |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
911 _init_file_attrs(self, module) # ExecutionLoader |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
912 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
|
913 try: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
914 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
|
915 except NotImplementedError: |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
916 pass |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
917 |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
918 def load_module(self, fullname): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
919 """Load the specified module into sys.modules and return it.""" |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
920 with module_to_load(fullname) as module: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
921 self.init_module_attrs(module) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
922 code = self.get_code(fullname) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
923 if code is None: |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
924 raise ImportError('cannot load module {!r} when get_code() ' |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
925 'returns None'.format(fullname)) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
926 _call_with_frames_removed(exec, code, module.__dict__) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
927 return module |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
928 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
929 |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
930 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
|
931 |
|
67573
e125d92f7438
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
66226
diff
changeset
|
932 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
|
933 """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
|
934 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
|
935 |
|
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
936 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
|
937 """ |
|
83225
8e733e30edf6
Issue #17093,17566,17567: Methods from classes in importlib.abc now raise/return
Brett Cannon <brett@python.org>
parents:
83056
diff
changeset
|
938 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
|
939 |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
940 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
|
941 """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
|
942 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
|
943 Possible keys: |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
944 - '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
|
945 code modification; |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
946 - '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
|
947 |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
948 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
|
949 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
|
950 """ |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
951 return {'mtime': self.path_mtime(path)} |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
952 |
|
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
|
953 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
|
954 """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
|
955 |
|
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
|
956 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
|
957 |
|
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
|
958 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
|
959 """ |
|
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
|
960 # 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
|
961 return self.set_data(cache_path, data) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
962 |
|
67573
e125d92f7438
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
66226
diff
changeset
|
963 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
|
964 """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
|
965 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
966 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
|
967 """ |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
968 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
969 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
970 def get_source(self, fullname): |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
971 """Concrete implementation of InspectLoader.get_source.""" |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
972 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
|
973 try: |
|
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
974 source_bytes = self.get_data(path) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80944
diff
changeset
|
975 except OSError as exc: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
976 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
|
977 name=fullname) from exc |
|
84173
bdd60bedf933
Issue #18076: Introduce imoportlib.util.decode_source().
Brett Cannon <brett@python.org>
parents:
84172
diff
changeset
|
978 return decode_source(source_bytes) |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
979 |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
980 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
|
981 """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
|
982 |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
983 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
|
984 """ |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
985 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
|
986 dont_inherit=True, optimize=_optimize) |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
987 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
988 def get_code(self, fullname): |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
989 """Concrete implementation of InspectLoader.get_code. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
990 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
991 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
|
992 bytecode, set_data must also be implemented. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
993 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
994 """ |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
995 source_path = self.get_filename(fullname) |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
996 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
|
997 try: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
998 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
|
999 except NotImplementedError: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
1000 bytecode_path = None |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
1001 else: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1002 try: |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1003 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
|
1004 except IOError: |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1005 pass |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1006 else: |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1007 source_mtime = int(st['mtime']) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1008 try: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1009 data = self.get_data(bytecode_path) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80944
diff
changeset
|
1010 except OSError: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1011 pass |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1012 else: |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1013 try: |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1014 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
|
1015 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
|
1016 path=bytecode_path) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1017 except (ImportError, EOFError): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1018 pass |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1019 else: |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1020 _verbose_message('{} matches {}', bytecode_path, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
1021 source_path) |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1022 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
|
1023 bytecode_path=bytecode_path, |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
1024 source_path=source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1025 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
|
1026 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
|
1027 _verbose_message('code object from {}', source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1028 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
|
1029 source_mtime is not None): |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1030 data = _code_to_bytecode(code_object, source_mtime, |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1031 len(source_bytes)) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1032 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
|
1033 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
|
1034 _verbose_message('wrote {!r}', bytecode_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1035 except NotImplementedError: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1036 pass |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1037 return code_object |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1038 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1039 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1040 class FileLoader: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1041 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1042 """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
|
1043 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
|
1044 |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1045 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
|
1046 """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
|
1047 finder.""" |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1048 self.name = fullname |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1049 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
|
1050 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
1051 @_check_name |
| 76877 | 1052 def load_module(self, fullname): |
| 1053 """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
|
1054 # 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
|
1055 # 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
|
1056 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
|
1057 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
1058 @_check_name |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1059 def get_filename(self, fullname): |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1060 """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
|
1061 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
|
1062 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1063 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
|
1064 """Return the data from path as raw bytes.""" |
|
64407
f8ba9558adbf
Remove redundant context manager.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
64291
diff
changeset
|
1065 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
|
1066 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
|
1067 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1068 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1069 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
|
1070 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1071 """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
|
1072 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1073 def path_stats(self, path): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
1074 """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
|
1075 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
|
1076 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
|
1077 |
|
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
|
1078 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
|
1079 # 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
|
1080 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
|
1081 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
|
1082 |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1083 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
|
1084 """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
|
1085 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
|
1086 path_parts = [] |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1087 # 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
|
1088 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
|
1089 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
|
1090 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
|
1091 # Create needed directories. |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1092 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
|
1093 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
|
1094 try: |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1095 _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
|
1096 except FileExistsError: |
|
64240
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1097 # 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
|
1098 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
|
1099 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
|
1100 # 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
|
1101 # 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
|
1102 _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
|
1103 return |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1104 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
|
1105 _write_atomic(path, data, _mode) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1106 _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
|
1107 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
|
1108 # 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
|
1109 _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
|
1110 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1111 |
|
76548
a2cf07135e4f
Issue #14605: Rename _SourcelessFileLoader to SourcelessFileLoader.
Marc-Andre Lemburg <mal@egenix.com>
parents:
76547
diff
changeset
|
1112 class SourcelessFileLoader(FileLoader, _LoaderBasics): |
|
55355
dfaf6de2c8ce
Implement the PEP 302 protocol for get_filename() as
Brett Cannon <bcannon@gmail.com>
parents:
52633
diff
changeset
|
1113 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1114 """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
|
1115 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1116 def init_module_attrs(self, module): |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1117 super().init_module_attrs(module) |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1118 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
|
1119 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1120 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
|
1121 path = self.get_filename(fullname) |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1122 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
|
1123 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
|
1124 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
|
1125 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1126 def get_source(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1127 """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
|
1128 return None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1129 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1130 |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1131 # 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
|
1132 EXTENSION_SUFFIXES = [] |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1133 |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1134 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1135 class ExtensionFileLoader: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1136 |
|
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
|
1137 """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
|
1138 |
|
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
|
1139 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
|
1140 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1141 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1142 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1143 def __init__(self, name, path): |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1144 self.name = name |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1145 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
|
1146 |
|
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
|
1147 @_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
|
1148 @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
|
1149 @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
|
1150 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
|
1151 """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
|
1152 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
|
1153 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
|
1154 fullname, self.path) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1155 _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
|
1156 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
|
1157 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
|
1158 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
|
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 is_package(self, fullname): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
1161 """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
|
1162 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
|
1163 return any(file_name == '__init__' + suffix |
|
e024f6ba5ed8
update docstring per the extension package fix, refactor
Philip Jenvey <pjenvey@underboss.org>
parents:
78486
diff
changeset
|
1164 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
|
1165 |
|
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 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
|
1167 """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
|
1168 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
|
1169 |
|
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
|
1170 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
|
1171 """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
|
1172 return None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1173 |
|
85946
832579dbafd6
[issue19152] Add ExtensionFileLoader.get_filename().
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85945
diff
changeset
|
1174 @_check_name |
|
832579dbafd6
[issue19152] Add ExtensionFileLoader.get_filename().
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85945
diff
changeset
|
1175 def get_filename(self, fullname): |
|
832579dbafd6
[issue19152] Add ExtensionFileLoader.get_filename().
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85945
diff
changeset
|
1176 """Return the path to the source file as found by the finder.""" |
|
832579dbafd6
[issue19152] Add ExtensionFileLoader.get_filename().
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85945
diff
changeset
|
1177 return self.path |
|
832579dbafd6
[issue19152] Add ExtensionFileLoader.get_filename().
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85945
diff
changeset
|
1178 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1179 |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1180 class _NamespacePath: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1181 """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
|
1182 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
|
1183 __path__. When this changes, the module's own path is recomputed, |
| 80409 | 1184 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
|
1185 is sys.path.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1186 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1187 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
|
1188 self._name = name |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1189 self._path = path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1190 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
|
1191 self._path_finder = path_finder |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1192 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1193 def _find_parent_path_names(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1194 """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
|
1195 parent, dot, me = self._name.rpartition('.') |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1196 if dot == '': |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1197 # 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
|
1198 return 'sys', 'path' |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1199 # 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
|
1200 # parent path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1201 return parent, '__path__' |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1202 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1203 def _get_parent_path(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1204 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
|
1205 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
|
1206 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1207 def _recalculate(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1208 # 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
|
1209 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
|
1210 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
|
1211 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
|
1212 # 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
|
1213 # do remember the new parent path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1214 if loader is None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1215 self._path = new_path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1216 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
|
1217 return self._path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1218 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1219 def __iter__(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1220 return iter(self._recalculate()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1221 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1222 def __len__(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1223 return len(self._recalculate()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1224 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1225 def __repr__(self): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1226 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
|
1227 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1228 def __contains__(self, item): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1229 return item in self._recalculate() |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1230 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1231 def append(self, item): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1232 self._path.append(item) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1233 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1234 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1235 class NamespaceLoader: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1236 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
|
1237 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
|
1238 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1239 @classmethod |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1240 def module_repr(cls, module): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1241 return '<module {!r} (namespace)>'.format(module.__name__) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1242 |
|
84169
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1243 def is_package(self, fullname): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1244 return True |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1245 |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1246 def get_source(self, fullname): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1247 return '' |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1248 |
|
84169
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1249 def get_code(self, fullname): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1250 return compile('', '<string>', 'exec', dont_inherit=True) |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1251 |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1252 def init_module_attrs(self, module): |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1253 module.__loader__ = self |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1254 module.__package__ = module.__name__ |
|
ebec625b13f9
Issues #18058, 18057: Make importlib._bootstrap.NamespaceLoader
Brett Cannon <brett@python.org>
parents:
84134
diff
changeset
|
1255 |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1256 def load_module(self, fullname): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1257 """Load a namespace module.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1258 _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
|
1259 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
|
1260 self.init_module_attrs(module) |
|
84001
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1261 module.__path__ = self._path |
|
e873f2e67353
Issues #18088, 18089: Introduce
Brett Cannon <brett@python.org>
parents:
83999
diff
changeset
|
1262 return module |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1263 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1264 |
|
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
|
1265 # Finders ##################################################################### |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1266 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1267 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
|
1268 |
|
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
|
1269 """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
|
1270 |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1271 @classmethod |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1272 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
|
1273 """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
|
1274 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
|
1275 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
|
1276 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
|
1277 finder.invalidate_caches() |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1278 |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1279 @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
|
1280 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
|
1281 """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
|
1282 |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1283 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
|
1284 |
|
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
|
1285 """ |
|
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 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
|
1287 _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
|
1288 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
|
1289 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
|
1290 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
|
1291 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
|
1292 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
|
1293 else: |
|
76582
7025ee00dbf6
Issue #14605: Use None in sys.path_importer_cache to represent no
Brett Cannon <brett@python.org>
parents:
76579
diff
changeset
|
1294 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
|
1295 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1296 @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
|
1297 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
|
1298 """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
|
1299 |
|
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
|
1300 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
|
1301 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
|
1302 |
|
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
|
1303 """ |
|
74994
b8593ec7e8c5
Tweak the handling of the empty string in sys.path for importlib.
Brett Cannon <brett@python.org>
parents:
74992
diff
changeset
|
1304 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
|
1305 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
|
1306 try: |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1307 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
|
1308 except KeyError: |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1309 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
|
1310 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
|
1311 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
|
1312 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1313 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1314 def _get_loader(cls, fullname, path): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1315 """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
|
1316 # 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
|
1317 # 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
|
1318 namespace_path = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1319 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
|
1320 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
|
1321 continue |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1322 finder = cls._path_importer_cache(entry) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1323 if finder is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1324 if hasattr(finder, 'find_loader'): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1325 loader, portions = finder.find_loader(fullname) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1326 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1327 loader = finder.find_module(fullname) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1328 portions = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1329 if loader is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1330 # 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
|
1331 return loader, namespace_path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1332 # 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
|
1333 # 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
|
1334 # 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
|
1335 # on path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1336 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
|
1337 else: |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1338 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
|
1339 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1340 @classmethod |
|
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1341 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
|
1342 """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
|
1343 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
|
1344 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
|
1345 path = sys.path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1346 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
|
1347 if loader is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1348 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
|
1349 else: |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1350 if namespace_path: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1351 # 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
|
1352 # 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
|
1353 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
|
1354 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1355 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
|
1356 |
|
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
|
1357 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1358 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
|
1359 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1360 """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
|
1361 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1362 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
|
1363 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
|
1364 |
|
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
|
1365 """ |
|
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
|
1366 |
|
84174
e13371d5b4e4
Fix a misnaming of a method and an argument
Brett Cannon <brett@python.org>
parents:
83055
diff
changeset
|
1367 def __init__(self, path, *loader_details): |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1368 """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
|
1369 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
|
1370 recognizes.""" |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1371 loaders = [] |
|
84174
e13371d5b4e4
Fix a misnaming of a method and an argument
Brett Cannon <brett@python.org>
parents:
83055
diff
changeset
|
1372 for loader, suffixes in loader_details: |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1373 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
|
1374 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
|
1375 # 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
|
1376 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
|
1377 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
|
1378 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
|
1379 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
|
1380 |
|
75324
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1381 def invalidate_caches(self): |
|
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1382 """Invalidate the directory mtime.""" |
|
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1383 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
|
1384 |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
1385 find_module = _find_module_shim |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1386 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1387 def find_loader(self, fullname): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1388 """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
|
1389 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
|
1390 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
|
1391 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
|
1392 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
|
1393 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
|
1394 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
|
1395 mtime = -1 |
|
75324
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1396 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
|
1397 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
|
1398 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
|
1399 # 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
|
1400 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
|
1401 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
|
1402 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
|
1403 else: |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1404 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
|
1405 cache_module = tail_module |
| 76309 | 1406 # 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
|
1407 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
|
1408 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
|
1409 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
|
1410 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
|
1411 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
|
1412 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
|
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), [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
|
1415 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
|
1416 # 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
|
1417 # 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
|
1418 is_namespace = True |
| 76309 | 1419 # 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
|
1420 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
|
1421 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
|
1422 _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
|
1423 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
|
1424 if _path_isfile(full_path): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1425 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
|
1426 if is_namespace: |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
1427 _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
|
1428 return (None, [base_path]) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1429 return (None, []) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1430 |
|
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
|
1431 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
|
1432 """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
|
1433 path = self.path |
|
78663
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1434 try: |
|
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1435 contents = _os.listdir(path) |
|
81427
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1436 except (FileNotFoundError, PermissionError, NotADirectoryError): |
|
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1437 # 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
|
1438 # unreadable. |
|
78663
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1439 contents = [] |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1440 # 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
|
1441 # 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
|
1442 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
|
1443 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
|
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 # 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
|
1446 # 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
|
1447 # 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
|
1448 # 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
|
1449 # 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
|
1450 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
|
1451 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
|
1452 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
|
1453 if dot: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1454 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
|
1455 else: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1456 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
|
1457 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
|
1458 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
|
1459 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
|
1460 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
|
1461 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1462 @classmethod |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1463 def path_hook(cls, *loader_details): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1464 """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
|
1465 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
|
1466 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
|
1467 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1468 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
|
1469 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
|
1470 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1471 """ |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1472 def path_hook_for_FileFinder(path): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1473 """Path hook for importlib.machinery.FileFinder.""" |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1474 if not _path_isdir(path): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1475 raise ImportError('only directories are supported', path=path) |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1476 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
|
1477 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1478 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
|
1479 |
|
77600
df856963fc6c
A better repr() for FileFinder
Antoine Pitrou <solipsis@pitrou.net>
parents:
77457
diff
changeset
|
1480 def __repr__(self): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1481 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
|
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 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
1484 # Import itself ############################################################### |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
1485 |
|
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 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
|
1487 |
|
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
|
1488 """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
|
1489 |
|
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
|
1490 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
|
1491 """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
|
1492 _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
|
1493 |
|
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
|
1494 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
|
1495 """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
|
1496 _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
|
1497 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1498 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1499 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
|
1500 """Resolve a relative module name to an absolute one.""" |
|
75250
8840037a9c53
unused imports, pep8
Philip Jenvey <pjenvey@underboss.org>
parents:
75239
diff
changeset
|
1501 bits = package.rsplit('.', level - 1) |
|
75239
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1502 if len(bits) < level: |
|
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1503 raise ValueError('attempted relative import beyond top-level package') |
|
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1504 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
|
1505 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
|
1506 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1507 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1508 def _find_module(name, path): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1509 """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
|
1510 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
|
1511 _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
|
1512 for finder in sys.meta_path: |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1513 with _ImportLockContext(): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1514 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
|
1515 if loader is not None: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1516 # 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
|
1517 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
|
1518 return loader |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1519 else: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1520 return sys.modules[name].__loader__ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1521 else: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1522 return None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1523 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1524 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1525 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
|
1526 """Verify arguments are "sane".""" |
|
75228
909935a236e3
Do a type check instead of an interface check.
Brett Cannon <brett@python.org>
parents:
75193
diff
changeset
|
1527 if not isinstance(name, str): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1528 raise TypeError('module name must be str, not {}'.format(type(name))) |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1529 if level < 0: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1530 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
|
1531 if package: |
|
75228
909935a236e3
Do a type check instead of an interface check.
Brett Cannon <brett@python.org>
parents:
75193
diff
changeset
|
1532 if not isinstance(package, str): |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1533 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
|
1534 elif package not in sys.modules: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1535 msg = ('Parent module {!r} not loaded, cannot perform relative ' |
|
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1536 'import') |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1537 raise SystemError(msg.format(package)) |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1538 if not name and level == 0: |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1539 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
|
1540 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1541 |
|
84464
0d590683c8d1
Issue #18364: Stop using the ImportError._not_found hack.
Brett Cannon <brett@python.org>
parents:
84445
diff
changeset
|
1542 _ERR_MSG_PREFIX = 'No module named ' |
|
0d590683c8d1
Issue #18364: Stop using the ImportError._not_found hack.
Brett Cannon <brett@python.org>
parents:
84445
diff
changeset
|
1543 _ERR_MSG = _ERR_MSG_PREFIX + '{!r}' |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1544 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1545 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
|
1546 path = None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1547 parent = name.rpartition('.')[0] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1548 if parent: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1549 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
|
1550 _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
|
1551 # 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
|
1552 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
|
1553 return sys.modules[name] |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1554 # 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
|
1555 parent_module = sys.modules[parent] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1556 try: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1557 path = parent_module.__path__ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1558 except AttributeError: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1559 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
|
1560 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
|
1561 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
|
1562 if loader is None: |
|
84464
0d590683c8d1
Issue #18364: Stop using the ImportError._not_found hack.
Brett Cannon <brett@python.org>
parents:
84445
diff
changeset
|
1563 raise ImportError(_ERR_MSG.format(name), name=name) |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1564 elif name not in sys.modules: |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1565 # 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
|
1566 loader.load_module(name) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1567 _verbose_message('import {!r} # {!r}', name, loader) |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1568 # 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
|
1569 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
|
1570 if parent: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1571 # 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
|
1572 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
|
1573 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
|
1574 # 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
|
1575 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
|
1576 try: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1577 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
|
1578 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
|
1579 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
|
1580 except AttributeError: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1581 pass |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1582 # 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
|
1583 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
|
1584 try: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1585 module.__loader__ = loader |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1586 except AttributeError: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1587 pass |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1588 return module |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1589 |
|
66226
af13fb6fb3df
Fix a minor inconsistency in capitalization for the 'No module named' exception
Brett Cannon <bcannon@gmail.com>
parents:
64407
diff
changeset
|
1590 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1591 def _find_and_load(name, import_): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1592 """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
|
1593 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1594 lock = _get_module_lock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1595 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1596 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1597 lock.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1598 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1599 return _find_and_load_unlocked(name, import_) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1600 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1601 lock.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1602 |
|
66226
af13fb6fb3df
Fix a minor inconsistency in capitalization for the 'No module named' exception
Brett Cannon <bcannon@gmail.com>
parents:
64407
diff
changeset
|
1603 |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1604 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
|
1605 """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
|
1606 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
|
1607 |
|
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1608 This function represents the greatest common denominator of functionality |
| 68447 | 1609 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
|
1610 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
|
1611 |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1612 """ |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1613 _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
|
1614 if level > 0: |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1615 name = _resolve_name(name, package, level) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1616 _imp.acquire_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1617 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
|
1618 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
|
1619 module = sys.modules[name] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1620 if module is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1621 _imp.release_lock() |
|
84582
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1622 message = ('import of {} halted; ' |
|
33d379c2bb79
Issue #18415: Normalize what type of quotes are used with string
Brett Cannon <brett@python.org>
parents:
84468
diff
changeset
|
1623 'None in sys.modules'.format(name)) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1624 raise ImportError(message, name=name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1625 _lock_unlock_module(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1626 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1627 |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1628 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
|
1629 """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
|
1630 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1631 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
|
1632 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
|
1633 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
|
1634 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1635 """ |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1636 # The hell that is fromlist ... |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1637 # 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
|
1638 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
|
1639 if '*' in fromlist: |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1640 fromlist = list(fromlist) |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1641 fromlist.remove('*') |
|
78051
dc18a2a66d16
Issue #15111: When a module was imported using a 'from import'
Brett Cannon <brett@python.org>
parents:
78042
diff
changeset
|
1642 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
|
1643 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
|
1644 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
|
1645 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
|
1646 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
|
1647 try: |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1648 _call_with_frames_removed(import_, from_name) |
|
78758
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1649 except ImportError as exc: |
|
78619
0d52f125dd32
Issue #15715: Ignore failed imports triggered by the use of fromlist.
Brett Cannon <brett@python.org>
parents:
78511
diff
changeset
|
1650 # 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
|
1651 # 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
|
1652 # exist. |
|
84464
0d590683c8d1
Issue #18364: Stop using the ImportError._not_found hack.
Brett Cannon <brett@python.org>
parents:
84445
diff
changeset
|
1653 if str(exc).startswith(_ERR_MSG_PREFIX): |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1654 if exc.name == from_name: |
|
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1655 continue |
|
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1656 raise |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1657 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1658 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1659 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1660 def _calc___package__(globals): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1661 """Calculate what __package__ should be. |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1662 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1663 __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
|
1664 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
|
1665 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1666 """ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1667 package = globals.get('__package__') |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1668 if package is None: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1669 package = globals['__name__'] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1670 if '__path__' not in globals: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1671 package = package.rpartition('.')[0] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1672 return package |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1673 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1674 |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1675 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
|
1676 """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
|
1677 |
|
85945
32b18998a560
[issue19151] Fix docstring and use of _get_suppported_file_loaders() to reflect 2-tuples.
Eric Snow <ericsnowcurrently@gmail.com>
parents:
85518
diff
changeset
|
1678 Each item is a tuple (loader, 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
|
1679 """ |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1680 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
|
1681 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
|
1682 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
|
1683 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
|
1684 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1685 |
|
78456
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1686 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
|
1687 """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
|
1688 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1689 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
|
1690 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
|
1691 '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
|
1692 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
|
1693 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
|
1694 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
|
1695 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1696 """ |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1697 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
|
1698 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
|
1699 else: |
|
78456
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1700 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
|
1701 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
|
1702 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
|
1703 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
|
1704 # 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
|
1705 # 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
|
1706 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
|
1707 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
|
1708 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
|
1709 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1710 else: |
| 79228 | 1711 # Figure out where to slice the module's name up to the first dot |
| 1712 # 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
|
1713 cut_off = len(name) - len(name.partition('.')[0]) |
| 79228 | 1714 # Slice end needs to be positive to alleviate need to special-case |
| 1715 # when ``'.' not in name``. | |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76309
diff
changeset
|
1716 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
|
1717 else: |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1718 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
|
1719 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1720 |
|
76445
c820aa9c0c00
Issue #13959: Keep imp.get_magic() in C code, but cache in importlib
Brett Cannon <brett@python.org>
parents:
76428
diff
changeset
|
1721 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1722 def _setup(sys_module, _imp_module): |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1723 """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
|
1724 into the global namespace. |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1725 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1726 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
|
1727 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
|
1728 |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1729 """ |
|
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
|
1730 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
|
1731 _imp = _imp_module |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1732 sys = sys_module |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1733 |
|
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
|
1734 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
|
1735 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
|
1736 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
|
1737 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
|
1738 |
|
81869
05747d3bcd9c
Issue #17098: Make sure every module has __loader__ defined.
Brett Cannon <brett@python.org>
parents:
81427
diff
changeset
|
1739 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
|
1740 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
|
1741 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
|
1742 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
|
1743 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
|
1744 module.__loader__ = BuiltinImporter |
|
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1745 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
|
1746 module.__loader__ = FrozenImporter |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1747 |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1748 self_module = sys.modules[__name__] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1749 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
|
1750 if builtin_name not in sys.modules: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1751 builtin_module = BuiltinImporter.load_module(builtin_name) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1752 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1753 builtin_module = sys.modules[builtin_name] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1754 setattr(self_module, builtin_name, builtin_module) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1755 |
|
79480
15949f34e08f
#16135: Removal of OS/2 support (Python code partial cleanup)
Jesus Cea <jcea@jcea.es>
parents:
79228
diff
changeset
|
1756 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
|
1757 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
|
1758 # 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
|
1759 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
|
1760 path_sep = path_separators[0] |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1761 if builtin_os in sys.modules: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1762 os_module = sys.modules[builtin_os] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1763 break |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1764 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1765 try: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1766 os_module = BuiltinImporter.load_module(builtin_os) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1767 break |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1768 except ImportError: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1769 continue |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1770 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1771 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
|
1772 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1773 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1774 thread_module = BuiltinImporter.load_module('_thread') |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1775 except ImportError: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1776 # Python was built without threads |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1777 thread_module = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1778 weakref_module = BuiltinImporter.load_module('_weakref') |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1779 |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1780 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
|
1781 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
|
1782 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
|
1783 |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1784 setattr(self_module, '_os', os_module) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1785 setattr(self_module, '_thread', thread_module) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1786 setattr(self_module, '_weakref', weakref_module) |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1787 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
|
1788 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
|
1789 # Constants |
|
75055
b8576719fe71
_relax_case -> _make_relax_case
Antoine Pitrou <solipsis@pitrou.net>
parents:
75048
diff
changeset
|
1790 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
|
1791 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
|
1792 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
|
1793 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
|
1794 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
|
1795 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
|
1796 |
|
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
|
1797 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1798 def _install(sys_module, _imp_module): |
| 76765 | 1799 """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
|
1800 _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
|
1801 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
|
1802 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
|
1803 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
|
1804 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
|
1805 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
|
1806 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
|
1807 sys.meta_path.append(PathFinder) |
