Mercurial > cpython-lru_cache-weakref
annotate Lib/importlib/_bootstrap.py @ 83191:0437c19cdad0
gibibytes (Arfrever)
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Sun, 07 Apr 2013 23:46:52 +0200 |
| parents | 9a44e845a90e |
| children | 8e733e30edf6 |
| 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 |
|
acfdf46b8de1
Issue #14605 and #14642:
Marc-Andre Lemburg <mal@egenix.com>
parents:
76548
diff
changeset
|
12 # update. Not doing so, will result in the Makefile to fail for |
|
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 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
23 # XXX Make sure all public names have no single leading underscore and all |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
24 # others do. |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
25 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
26 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
27 # Bootstrap-related code ###################################################### |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
28 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
29 _CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' |
|
74643
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
30 |
|
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
31 |
|
75055
b8576719fe71
_relax_case -> _make_relax_case
Antoine Pitrou <solipsis@pitrou.net>
parents:
75048
diff
changeset
|
32 def _make_relax_case(): |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
33 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
|
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 b'PYTHONCASEOK' in _os.environ |
|
74643
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
37 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
|
38 def _relax_case(): |
|
75070
defd944af91b
put docstrings on functions
Benjamin Peterson <benjamin@python.org>
parents:
75055
diff
changeset
|
39 """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
|
40 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
|
41 return _relax_case |
|
74643
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
42 |
|
ecf4a7bb8807
Relocate importlib._case_ok to importlib._bootstrap.
Brett Cannon <brett@python.org>
parents:
74630
diff
changeset
|
43 |
|
74630
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
44 # TODO: Expose from marshal |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
45 def _w_long(x): |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
46 """Convert a 32-bit integer to little-endian. |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
47 |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
48 XXX Temporary until marshal's long functions are exposed. |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
49 |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
50 """ |
|
82385
d98a82f4c9bd
Issue #17220: two fixes for changeset 2528e4aea338.
Brett Cannon <brett@python.org>
parents:
82382
diff
changeset
|
51 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
|
52 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
53 |
|
74630
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
54 # TODO: Expose from marshal |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
55 def _r_long(int_bytes): |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
56 """Convert 4 bytes in little-endian to an integer. |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
57 |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
58 XXX Temporary until marshal's long function are exposed. |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
59 |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
60 """ |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
61 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
|
62 |
|
7d8f016784cd
Move some code from importlib.__init__ to importlib._bootstrap that
Brett Cannon <brett@python.org>
parents:
74449
diff
changeset
|
63 |
|
76472
4e853913054c
Issue #13959: Continue to try to accomodate altsep in importlib by not
Brett Cannon <brett@python.org>
parents:
76466
diff
changeset
|
64 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
|
65 """Replacement for os.path.join().""" |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
66 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
|
67 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
|
68 |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
69 |
|
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
70 def _path_split(path): |
|
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
71 """Replacement for os.path.split().""" |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
72 if len(path_separators) == 1: |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
73 front, _, tail = path.rpartition(path_sep) |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
74 return front, tail |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
75 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
|
76 if x in path_separators: |
|
82385
d98a82f4c9bd
Issue #17220: two fixes for changeset 2528e4aea338.
Brett Cannon <brett@python.org>
parents:
82382
diff
changeset
|
77 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
|
78 return front, tail |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
79 return '', path |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
80 |
|
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 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
|
83 """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
|
84 try: |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
85 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
|
86 except OSError: |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
87 return False |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
88 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
|
89 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
90 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
91 # 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
|
92 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
|
93 """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
|
94 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
|
95 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
96 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
97 # 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
|
98 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
|
99 """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
|
100 if not path: |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
101 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
|
102 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
|
103 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
104 |
|
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
|
105 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
|
106 """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
|
107 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
|
108 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
|
109 # 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
|
110 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
|
111 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
|
112 _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
|
113 try: |
|
74998
de6703671386
Have importlib use os.replace() for atomic renaming.
Brett Cannon <brett@python.org>
parents:
74994
diff
changeset
|
114 # 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
|
115 # 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
|
116 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
|
117 file.write(data) |
|
74998
de6703671386
Have importlib use os.replace() for atomic renaming.
Brett Cannon <brett@python.org>
parents:
74994
diff
changeset
|
118 _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
|
119 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
|
120 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
|
121 _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
|
122 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
|
123 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
|
124 raise |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
125 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
126 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
127 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
|
128 """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
|
129 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
|
130 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
|
131 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
|
132 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
|
133 |
|
43d3a95ed662
Create a simple substitute for functools.wraps to use in importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
51430
diff
changeset
|
134 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
135 _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
|
136 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
137 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
138 def new_module(name): |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
139 """Create a new module. |
|
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
140 |
|
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
141 The module is not entered into sys.modules. |
|
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
142 |
|
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
143 """ |
| 76755 | 144 return type(_io)(name) |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
145 |
|
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
146 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
147 # Module-level locking ######################################################## |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
148 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
149 # 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
|
150 _module_locks = {} |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
151 # 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
|
152 _blocking_on = {} |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
153 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
154 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
155 class _DeadlockError(RuntimeError): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
156 pass |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
157 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
158 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
159 class _ModuleLock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
160 """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
|
161 (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
|
162 take locks B then A). |
|
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 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
165 def __init__(self, name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
166 self.lock = _thread.allocate_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
167 self.wakeup = _thread.allocate_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
168 self.name = name |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
169 self.owner = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
170 self.count = 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
171 self.waiters = 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
172 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
173 def has_deadlock(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
174 # Deadlock avoidance for concurrent circular imports. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
175 me = _thread.get_ident() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
176 tid = self.owner |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
177 while True: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
178 lock = _blocking_on.get(tid) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
179 if lock is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
180 return False |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
181 tid = lock.owner |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
182 if tid == me: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
183 return True |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
184 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
185 def acquire(self): |
|
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 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
|
188 a _DeadlockError is raised. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
189 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
|
190 """ |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
191 tid = _thread.get_ident() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
192 _blocking_on[tid] = self |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
193 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
194 while True: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
195 with self.lock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
196 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
|
197 self.owner = tid |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
198 self.count += 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
199 return True |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
200 if self.has_deadlock(): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
201 raise _DeadlockError("deadlock detected by %r" % self) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
202 if self.wakeup.acquire(False): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
203 self.waiters += 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
204 # Wait for a release() call |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
205 self.wakeup.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
206 self.wakeup.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
207 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
208 del _blocking_on[tid] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
209 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
210 def release(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
211 tid = _thread.get_ident() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
212 with self.lock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
213 if self.owner != tid: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
214 raise RuntimeError("cannot release un-acquired lock") |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
215 assert self.count > 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
216 self.count -= 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
217 if self.count == 0: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
218 self.owner = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
219 if self.waiters: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
220 self.waiters -= 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
221 self.wakeup.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
222 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
223 def __repr__(self): |
|
79692
987a8724b220
Remove uses of % with str.format.
Brett Cannon <brett@python.org>
parents:
79653
diff
changeset
|
224 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
|
225 |
|
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 class _DummyModuleLock: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
228 """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
|
229 multi-threading support.""" |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
230 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
231 def __init__(self, name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
232 self.name = name |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
233 self.count = 0 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
234 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
235 def acquire(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
236 self.count += 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
237 return True |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
238 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
239 def release(self): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
240 if self.count == 0: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
241 raise RuntimeError("cannot release un-acquired lock") |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
242 self.count -= 1 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
243 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
244 def __repr__(self): |
|
79692
987a8724b220
Remove uses of % with str.format.
Brett Cannon <brett@python.org>
parents:
79653
diff
changeset
|
245 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
|
246 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
247 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
248 # 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
|
249 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
250 def _get_module_lock(name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
251 """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
|
252 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
253 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
|
254 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
|
255 try: |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
256 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
|
257 except KeyError: |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
258 pass |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
259 if lock is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
260 if _thread is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
261 lock = _DummyModuleLock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
262 else: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
263 lock = _ModuleLock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
264 def cb(_): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
265 del _module_locks[name] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
266 _module_locks[name] = _weakref.ref(lock, cb) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
267 return lock |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
268 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
269 def _lock_unlock_module(name): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
270 """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
|
271 module lock for a given module name. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
272 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
|
273 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
|
274 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
275 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
|
276 lock = _get_module_lock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
277 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
278 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
279 lock.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
280 except _DeadlockError: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
281 # 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
|
282 # module object. |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
283 pass |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
284 else: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
285 lock.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
286 |
|
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
|
287 # Frame stripping magic ############################################### |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
288 |
|
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
|
289 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
|
290 """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
|
291 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
|
292 |
|
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
|
293 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
|
294 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
|
295 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
|
296 """ |
|
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
|
297 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
|
298 |
|
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
|
299 |
|
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
|
300 # Finder/loader utility code ############################################### |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
301 |
|
82957
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
302 # 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
|
303 # 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
|
304 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
305 # 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
|
306 # 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
|
307 # 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
|
308 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
309 # 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
|
310 # -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
|
311 # 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
|
312 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
313 # 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
|
314 # 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
|
315 # 10. |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
316 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
317 # 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
|
318 # 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
|
319 # 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
|
320 # 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
|
321 # 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
|
322 # 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
|
323 # 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
|
324 # 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
|
325 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
326 # Known values: |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
327 # 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
|
328 # 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
|
329 # 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
|
330 # 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
|
331 # 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
|
332 # 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
|
333 # 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
|
334 # 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
|
335 # 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
|
336 # 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
|
337 # 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
|
338 # 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
|
339 # 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
|
340 # 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
|
341 # 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
|
342 # 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
|
343 # 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
|
344 # 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
|
345 # 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
|
346 # 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
|
347 # 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
|
348 # 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
|
349 # 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
|
350 # 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
|
351 # 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
|
352 # 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
|
353 # 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
|
354 # 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
|
355 # 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
|
356 # 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
|
357 # 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
|
358 # 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
|
359 # 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
|
360 # 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
|
361 # 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
|
362 # 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
|
363 # 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
|
364 # 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
|
365 # 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
|
366 # 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
|
367 # 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
|
368 # 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
|
369 # 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
|
370 # 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
|
371 # 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
|
372 # 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
|
373 # 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
|
374 # 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
|
375 # 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
|
376 # 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
|
377 # 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
|
378 # 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
|
379 # 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
|
380 # 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
|
381 # 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
|
382 # 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
|
383 # 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
|
384 # 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
|
385 # 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
|
386 # 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
|
387 # 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
|
388 # 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
|
389 # 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
|
390 # keyword-only defaults) |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
391 # |
|
313bcff51900
Issue #17516: use comment syntax for comments, instead of multiline string
Victor Stinner <victor.stinner@gmail.com>
parents:
82876
diff
changeset
|
392 # 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
|
393 # 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
|
394 # 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
|
395 |
|
82382
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
396 _MAGIC_BYTES = (3250).to_bytes(2, 'little') + b'\r\n' |
|
2528e4aea338
Issue #17220: Little cleanup of _bootstrap.py.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82237
diff
changeset
|
397 _RAW_MAGIC_NUMBER = int.from_bytes(_MAGIC_BYTES, 'little') |
|
78042
efb5e6ab10f4
Issue #15167 (as part of #13959): imp.get_magic() is no implemented in
Brett Cannon <brett@python.org>
parents:
78026
diff
changeset
|
398 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
399 _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
|
400 |
|
76874
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
401 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
|
402 |
|
76874
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
403 DEBUG_BYTECODE_SUFFIXES = ['.pyc'] |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
404 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
|
405 |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
406 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
|
407 """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
|
408 |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
409 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
|
410 .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
|
411 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
|
412 |
| 79191 | 413 If debug_override is not None, then it must be a boolean and is used in |
| 414 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
|
415 |
|
78026
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
416 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
|
417 |
|
76450
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
418 """ |
|
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
|
419 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
|
420 if debug: |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
421 suffixes = DEBUG_BYTECODE_SUFFIXES |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
422 else: |
|
b81ddaf0db47
Issue #13959: Deprecate imp.get_suffixes() for new attributes on
Brett Cannon <brett@python.org>
parents:
76826
diff
changeset
|
423 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
|
424 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
|
425 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
|
426 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
|
427 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
|
428 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
|
429 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
|
430 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
|
431 |
|
b773a751c2e7
Issue #13959: Re-implement imp.cache_from_source() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
76449
diff
changeset
|
432 |
|
78078
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
433 def source_from_cache(path): |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
434 """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
|
435 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
436 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
|
437 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
|
438 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
|
439 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
|
440 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
441 """ |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
442 if sys.implementation.cache_tag is None: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
443 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
|
444 head, pycache_filename = _path_split(path) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
445 head, pycache = _path_split(head) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
446 if pycache != _PYCACHE: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
447 raise ValueError('{} not bottom-level directory in ' |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
448 '{!r}'.format(_PYCACHE, path)) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
449 if pycache_filename.count('.') != 2: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
450 raise ValueError('expected only 2 dots in ' |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
451 '{!r}'.format(pycache_filename)) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
452 base_filename = pycache_filename.partition('.')[0] |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
453 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
|
454 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
455 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
456 def _get_sourcefile(bytecode_path): |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
457 """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
|
458 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
459 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
|
460 PyImport_ExecCodeModuleWithFilenames() in the C API. |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
461 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
462 """ |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
463 if len(bytecode_path) == 0: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
464 return None |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
465 rest, _, extension = bytecode_path.rparition('.') |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
466 if not rest or extension.lower()[-3:-1] != '.py': |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
467 return bytecode_path |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
468 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
469 try: |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
470 source_path = source_from_cache(bytecode_path) |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
471 except (NotImplementedError, ValueError): |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
472 source_path = bytcode_path[-1:] |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
473 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
474 return source_path if _path_isfile(source_stats) else bytecode_path |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
475 |
|
9e164b404983
Issues #15169, #14599: Make PyImport_ExecCodeModuleWithPathnames() use
Brett Cannon <brett@python.org>
parents:
78051
diff
changeset
|
476 |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
477 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
|
478 """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
|
479 if sys.flags.verbose >= verbosity: |
|
76327
1ca10eb58483
utilize startswith(tuple)
Philip Jenvey <pjenvey@underboss.org>
parents:
76312
diff
changeset
|
480 if not message.startswith(('#', 'import ')): |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
481 message = '# ' + message |
|
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
482 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
|
483 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
484 |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
485 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
|
486 """Set __package__ on the returned module.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
487 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
|
488 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
|
489 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
|
490 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
|
491 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
|
492 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
|
493 return module |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
494 _wrap(set_package_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
495 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
|
496 |
|
5cdc5f0c134c
Move importlib completely over to using rpartition and accepting the empty
Brett Cannon <bcannon@gmail.com>
parents:
51429
diff
changeset
|
497 |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
498 def set_loader(fxn): |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
499 """Set __loader__ on the returned module.""" |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
500 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
|
501 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
|
502 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
|
503 module.__loader__ = self |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
504 return module |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
505 _wrap(set_loader_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
506 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
|
507 |
|
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
508 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
509 def module_for_loader(fxn): |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
510 """Decorator to handle selecting the proper module for loaders. |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
511 |
|
52164
0b19ba318071
Clean up docstring from importlib.util.module_for_loader.
Brett Cannon <bcannon@gmail.com>
parents:
52142
diff
changeset
|
512 The decorated function is passed the module to use instead of the module |
|
0b19ba318071
Clean up docstring from importlib.util.module_for_loader.
Brett Cannon <bcannon@gmail.com>
parents:
52142
diff
changeset
|
513 name. The module passed in to the function is either from sys.modules if |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
514 it already exists or is a new module. If the module is new, then __name__ |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
515 is set the first argument to the method, __loader__ is set to self, and |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
516 __package__ is set accordingly (if self.is_package() is defined) will be set |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
517 before it is passed to the decorated function (if self.is_package() does |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
518 not work for the module it will be set post-load). |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
519 |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
520 If an exception is raised and the decorator created the module it is |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
521 subsequently removed from sys.modules. |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
522 |
|
52164
0b19ba318071
Clean up docstring from importlib.util.module_for_loader.
Brett Cannon <bcannon@gmail.com>
parents:
52142
diff
changeset
|
523 The decorator assumes that the decorated function takes the module name as |
|
0b19ba318071
Clean up docstring from importlib.util.module_for_loader.
Brett Cannon <bcannon@gmail.com>
parents:
52142
diff
changeset
|
524 the second argument. |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
525 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
526 """ |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
527 def module_for_loader_wrapper(self, fullname, *args, **kwargs): |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
528 module = sys.modules.get(fullname) |
|
76384
c1399cf7bd6a
Issue #12599: Be more strict in accepting None vs. a false-like object
Brett Cannon <brett@python.org>
parents:
76331
diff
changeset
|
529 is_reload = module is not None |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
530 if not is_reload: |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
531 # This must be done before open() is called as the 'io' module |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
532 # implicitly imports 'locale' and would otherwise trigger an |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
533 # infinite loop. |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
534 module = new_module(fullname) |
|
78779
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
535 # This must be done before putting the module in sys.modules |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
536 # (otherwise an optimization shortcut in import.c becomes wrong) |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
537 module.__initializing__ = True |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
538 sys.modules[fullname] = module |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
539 module.__loader__ = self |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
540 try: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
541 is_package = self.is_package(fullname) |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
542 except (ImportError, AttributeError): |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
543 pass |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
544 else: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
545 if is_package: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
546 module.__package__ = fullname |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
547 else: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
548 module.__package__ = fullname.rpartition('.')[0] |
|
78779
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
549 else: |
|
7fa6336e9864
Issue #15781: Fix two small race conditions in import's module locking.
Antoine Pitrou <solipsis@pitrou.net>
parents:
78758
diff
changeset
|
550 module.__initializing__ = True |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
551 try: |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
552 # If __package__ was not set above, __import__() will do it later. |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
553 return fxn(self, module, *args, **kwargs) |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
554 except: |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
555 if not is_reload: |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
556 del sys.modules[fullname] |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
557 raise |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
558 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
559 module.__initializing__ = False |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
560 _wrap(module_for_loader_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
561 return module_for_loader_wrapper |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
562 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
563 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
564 def _check_name(method): |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
565 """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
|
566 loader can handle. |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
567 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
568 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
|
569 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
|
570 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
571 """ |
| 76877 | 572 def _check_name_wrapper(self, name=None, *args, **kwargs): |
| 573 if name is None: | |
| 574 name = self.name | |
| 575 elif self.name != name: | |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
576 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
|
577 return method(self, name, *args, **kwargs) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
578 _wrap(_check_name_wrapper, method) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
579 return _check_name_wrapper |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
580 |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
581 |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
582 def _requires_builtin(fxn): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
583 """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
|
584 def _requires_builtin_wrapper(self, fullname): |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
585 if fullname not in sys.builtin_module_names: |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
586 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
|
587 name=fullname) |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
588 return fxn(self, fullname) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
589 _wrap(_requires_builtin_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
590 return _requires_builtin_wrapper |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
591 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
592 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
593 def _requires_frozen(fxn): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
594 """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
|
595 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
|
596 if not _imp.is_frozen(fullname): |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
597 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
|
598 name=fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
599 return fxn(self, fullname) |
|
74449
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
600 _wrap(_requires_frozen_wrapper, fxn) |
|
9935f7837c4b
Issue #13588: Rename decorators in importlib.
Brett Cannon <brett@python.org>
parents:
74358
diff
changeset
|
601 return _requires_frozen_wrapper |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
602 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
603 |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
604 def _find_module_shim(self, fullname): |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
605 """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
|
606 self.find_loader().""" |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
607 # 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
|
608 # is a namespace package portion), generate a warning and |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
609 # return None. |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
610 loader, portions = self.find_loader(fullname) |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
611 if loader is None and len(portions): |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
612 msg = "Not importing directory {}: missing __init__" |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
613 _warnings.warn(msg.format(portions[0]), ImportWarning) |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
614 return loader |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
615 |
|
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
616 |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
617 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
|
618 """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
|
619 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
|
620 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
621 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
|
622 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
623 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
|
624 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
|
625 truncated. |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
626 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
627 """ |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
628 exc_details = {} |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
629 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
|
630 exc_details['name'] = name |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
631 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
632 # 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
|
633 name = '<bytecode>' |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
634 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
|
635 exc_details['path'] = path |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
636 magic = data[:4] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
637 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
|
638 raw_size = data[8:12] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
639 if magic != _MAGIC_BYTES: |
| 83056 | 640 message = 'bad magic number in {!r}: {!r}'.format(name, magic) |
| 641 _verbose_message(message) | |
| 642 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
|
643 elif len(raw_timestamp) != 4: |
|
81735
792810303239
Touch up exception messaging
Brett Cannon <brett@python.org>
parents:
81432
diff
changeset
|
644 message = 'incomplete 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
|
645 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
646 raise EOFError(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
647 elif len(raw_size) != 4: |
|
81735
792810303239
Touch up exception messaging
Brett Cannon <brett@python.org>
parents:
81432
diff
changeset
|
648 message = 'incomplete size 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
|
649 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
650 raise EOFError(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
651 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
|
652 try: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
653 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
|
654 except KeyError: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
655 pass |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
656 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
657 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
|
658 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
|
659 _verbose_message(message) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
660 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
|
661 try: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
662 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
|
663 except KeyError: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
664 pass |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
665 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
666 if _r_long(raw_size) != source_size: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
667 raise ImportError("bytecode is stale for {!r}".format(name), |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
668 **exc_details) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
669 return data[12:] |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
670 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
671 |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
672 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
|
673 """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
|
674 code = marshal.loads(data) |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
675 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
|
676 _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
|
677 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
|
678 _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
|
679 return code |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
680 else: |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
681 raise ImportError("Non-code object in {!r}".format(bytecode_path), |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
682 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
|
683 |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
684 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
|
685 """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
|
686 file.""" |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
687 data = bytearray(_MAGIC_BYTES) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
688 data.extend(_w_long(mtime)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
689 data.extend(_w_long(source_size)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
690 data.extend(marshal.dumps(code)) |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
691 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
|
692 |
|
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
|
693 |
|
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
|
694 # Loaders ##################################################################### |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
695 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
696 class BuiltinImporter: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
697 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
698 """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
|
699 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
700 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
|
701 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
|
702 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
703 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
704 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
705 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
706 def module_repr(cls, module): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
707 return "<module '{}' (built-in)>".format(module.__name__) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
708 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
709 @classmethod |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
710 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
|
711 """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
|
712 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
713 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
|
714 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
715 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
716 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
|
717 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
|
718 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
|
719 |
|
51026
c26f1af26bfc
Document both importlib.machinery.BuiltinImporter and FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
50983
diff
changeset
|
720 @classmethod |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
721 @set_package |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
722 @set_loader |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
723 @_requires_builtin |
|
51026
c26f1af26bfc
Document both importlib.machinery.BuiltinImporter and FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
50983
diff
changeset
|
724 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
|
725 """Load a built-in module.""" |
|
51681
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
726 is_reload = fullname in sys.modules |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
727 try: |
|
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
|
728 return _call_with_frames_removed(_imp.init_builtin, fullname) |
|
51681
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
729 except: |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
730 if not is_reload and fullname in sys.modules: |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
731 del sys.modules[fullname] |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
732 raise |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
733 |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
734 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
735 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
736 def get_code(cls, fullname): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
737 """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
|
738 return None |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
739 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
740 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
741 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
742 def get_source(cls, fullname): |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
743 """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
|
744 return None |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
745 |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
746 @classmethod |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
747 @_requires_builtin |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
748 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
|
749 """Return False as built-in modules are never packages.""" |
|
52166
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
750 return False |
|
69cd615b76fb
Implement InspectLoader for BuiltinImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52165
diff
changeset
|
751 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
752 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
753 class FrozenImporter: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
754 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
755 """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
|
756 |
|
52165
62f9dad628de
A few more docstring/API cleanups for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
52164
diff
changeset
|
757 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
|
758 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
|
759 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
760 """ |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
761 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
762 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
763 def module_repr(cls, m): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
764 return "<module '{}' (frozen)>".format(m.__name__) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
765 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
766 @classmethod |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
767 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
|
768 """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
|
769 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
|
770 |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
771 @classmethod |
|
52002
76a579b6bade
Rename importlib.util.set___package__ to set_package.
Brett Cannon <bcannon@gmail.com>
parents:
51995
diff
changeset
|
772 @set_package |
|
52115
afd7118c8ccf
Implement importlib.util.set_loader: a decorator to automatically set
Brett Cannon <bcannon@gmail.com>
parents:
52112
diff
changeset
|
773 @set_loader |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
774 @_requires_frozen |
|
50983
0940a4f2506e
Add importlib.machinery with its first tenants, BuitinImporter and
Brett Cannon <bcannon@gmail.com>
parents:
50893
diff
changeset
|
775 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
|
776 """Load a frozen module.""" |
|
51681
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
777 is_reload = fullname in sys.modules |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
778 try: |
|
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
|
779 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
|
780 # 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
|
781 del m.__file__ |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
782 return m |
|
51681
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
783 except: |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
784 if not is_reload and fullname in sys.modules: |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
785 del sys.modules[fullname] |
|
147fcebacb5b
Implement the more specific PEP 302 semantics for loaders and what happens upon
Brett Cannon <bcannon@gmail.com>
parents:
51639
diff
changeset
|
786 raise |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
787 |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
788 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
789 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
790 def get_code(cls, fullname): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
791 """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
|
792 return _imp.get_frozen_object(fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
793 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
794 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
795 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
796 def get_source(cls, fullname): |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
797 """Return None as frozen modules do not have source code.""" |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
798 return None |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
799 |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
800 @classmethod |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
801 @_requires_frozen |
|
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
802 def is_package(cls, fullname): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
803 """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
|
804 return _imp.is_frozen_package(fullname) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
805 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
806 |
|
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
|
807 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
|
808 |
|
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
|
809 """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
|
810 """ |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
811 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
812 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
|
813 "Software\\Python\\PythonCore\\{sys_version}" |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
814 "\\Modules\\{fullname}") |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
815 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
|
816 "Software\\Python\\PythonCore\\{sys_version}" |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
817 "\\Modules\\{fullname}\\Debug") |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
818 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
|
819 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
820 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
821 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
|
822 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
823 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
|
824 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
|
825 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
|
826 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
827 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
828 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
|
829 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
|
830 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
|
831 else: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
832 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
|
833 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
|
834 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
|
835 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
836 with cls._open_registry(key) as hkey: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
837 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
|
838 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
|
839 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
|
840 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
|
841 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
842 @classmethod |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
843 def 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
|
844 """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
|
845 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
|
846 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
|
847 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
|
848 try: |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
849 _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
|
850 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
|
851 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
|
852 for loader, suffixes, _ in _get_supported_file_loaders(): |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
853 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
|
854 return loader(fullname, filepath) |
|
52168
70f5f9113ae1
Implement InspectLoader for FrozenImporter.
Brett Cannon <bcannon@gmail.com>
parents:
52166
diff
changeset
|
855 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
856 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
857 class _LoaderBasics: |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
858 |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
859 """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
|
860 SourcelessFileLoader.""" |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
861 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
862 def is_package(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
863 """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
|
864 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
|
865 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
|
866 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
|
867 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
|
868 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
|
869 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
870 @module_for_loader |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
871 def _load_module(self, module, *, sourceless=False): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
872 """Helper for load_module able to handle either source or sourceless |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
873 loading.""" |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
874 name = module.__name__ |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
875 code_object = self.get_code(name) |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
876 module.__file__ = self.get_filename(name) |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
877 if not sourceless: |
|
78026
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
878 try: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
879 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
|
880 except NotImplementedError: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
881 module.__cached__ = module.__file__ |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
882 else: |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
883 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
|
884 if self.is_package(name): |
|
76449
163360370ad2
Make path manipulation more robust for platforms with alternative path
Brett Cannon <brett@python.org>
parents:
76445
diff
changeset
|
885 module.__path__ = [_path_split(module.__file__)[0]] |
|
82643
7647aae9481c
Issue #17117: Have both import itself and importlib.util.set_loader()
Brett Cannon <brett@python.org>
parents:
82385
diff
changeset
|
886 # __package__ and __loader set by @module_for_loader. |
|
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
|
887 _call_with_frames_removed(exec, code_object, module.__dict__) |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
888 return module |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
889 |
|
62756
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 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
|
892 |
|
67573
e125d92f7438
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
66226
diff
changeset
|
893 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
|
894 """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
|
895 specified path, where path is a str. |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
896 """ |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
897 raise NotImplementedError |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
898 |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
899 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
|
900 """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
|
901 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
|
902 Possible keys: |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
903 - '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
|
904 code modification; |
|
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
905 - '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
|
906 |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
907 Implementing this method allows the loader to read bytecode files. |
|
52112
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
908 """ |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
909 return {'mtime': self.path_mtime(path)} |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
910 |
|
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
|
911 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
|
912 """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
|
913 |
|
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
|
914 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
|
915 |
|
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
|
916 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
|
917 """ |
|
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
|
918 # 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
|
919 return self.set_data(cache_path, data) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
920 |
|
67573
e125d92f7438
Issue 10899: Remove function type annotations from the stdlib
Raymond Hettinger <python@rcn.com>
parents:
66226
diff
changeset
|
921 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
|
922 """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
|
923 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
924 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
|
925 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
926 """ |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
927 raise NotImplementedError |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
928 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
929 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
930 def get_source(self, fullname): |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
931 """Concrete implementation of InspectLoader.get_source.""" |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
932 import tokenize |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
933 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
|
934 try: |
|
03080fa08dfe
Implement get_source for importlib.abc.PyLoader using source_path and get_data.
Brett Cannon <bcannon@gmail.com>
parents:
52083
diff
changeset
|
935 source_bytes = self.get_data(path) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80944
diff
changeset
|
936 except OSError as exc: |
|
76280
c071af95772a
Have importlib take advantage of ImportError's new 'name' and 'path'
Brett Cannon <brett@python.org>
parents:
76081
diff
changeset
|
937 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
|
938 name=fullname) from exc |
|
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
|
939 readsource = _io.BytesIO(source_bytes).readline |
|
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
|
940 try: |
|
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
|
941 encoding = tokenize.detect_encoding(readsource) |
|
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
|
942 except SyntaxError as exc: |
|
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
|
943 raise ImportError("Failed to detect encoding", |
|
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
|
944 name=fullname) from exc |
|
62761
32682b253ffc
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62756
diff
changeset
|
945 newline_decoder = _io.IncrementalNewlineDecoder(None, True) |
|
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
|
946 try: |
|
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
|
947 return newline_decoder.decode(source_bytes.decode(encoding[0])) |
|
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
|
948 except UnicodeDecodeError as exc: |
|
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
|
949 raise ImportError("Failed to decode source file", |
|
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
|
950 name=fullname) from exc |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
951 |
|
81761
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
952 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
|
953 """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
|
954 |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
955 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
|
956 """ |
|
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
957 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
|
958 dont_inherit=True, optimize=_optimize) |
|
80507
e30bcce5c634
Issue #15627: Add the compile_source() method to
Brett Cannon <brett@python.org>
parents:
80410
diff
changeset
|
959 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
960 def get_code(self, fullname): |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
961 """Concrete implementation of InspectLoader.get_code. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
962 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
963 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
|
964 bytecode, set_data must also be implemented. |
|
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 """ |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
967 source_path = self.get_filename(fullname) |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
968 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
|
969 try: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
970 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
|
971 except NotImplementedError: |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
972 bytecode_path = None |
|
e86330669bb5
Issue #15056: imp.cache_from_source() and source_from_cache() raise
Brett Cannon <brett@python.org>
parents:
78010
diff
changeset
|
973 else: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
974 try: |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
975 st = self.path_stats(source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
976 except NotImplementedError: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
977 pass |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
978 else: |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
979 source_mtime = int(st['mtime']) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
980 try: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
981 data = self.get_data(bytecode_path) |
|
81039
7d69d04522e3
Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents:
80944
diff
changeset
|
982 except OSError: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
983 pass |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
984 else: |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
985 try: |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
986 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
|
987 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
|
988 path=bytecode_path) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
989 except (ImportError, EOFError): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
990 pass |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
991 else: |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
992 _verbose_message('{} matches {}', bytecode_path, |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76280
diff
changeset
|
993 source_path) |
|
81432
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
994 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
|
995 bytecode_path=bytecode_path, |
|
a4292889e942
Issue #15031: Refactor some code in importlib pertaining to validating
Brett Cannon <brett@python.org>
parents:
81428
diff
changeset
|
996 source_path=source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
997 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
|
998 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
|
999 _verbose_message('code object from {}', source_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1000 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
|
1001 source_mtime is not None): |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1002 data = _code_to_bytecode(code_object, source_mtime, |
|
d4eb02b6aac9
Port py_compile over to importlib
Brett Cannon <brett@python.org>
parents:
81735
diff
changeset
|
1003 len(source_bytes)) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1004 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
|
1005 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
|
1006 _verbose_message('wrote {!r}', bytecode_path) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1007 except NotImplementedError: |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1008 pass |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1009 return code_object |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1010 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1011 def load_module(self, fullname): |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1012 """Concrete implementation of Loader.load_module. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1013 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1014 Requires ExecutionLoader.get_filename and ResourceLoader.get_data to be |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1015 implemented to load source code. Use of bytecode is dictated by whether |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1016 get_code uses/writes bytecode. |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1017 |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1018 """ |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1019 return self._load_module(fullname) |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1020 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1021 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1022 class FileLoader: |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1023 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1024 """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
|
1025 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
|
1026 |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1027 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
|
1028 """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
|
1029 finder.""" |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1030 self.name = fullname |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1031 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
|
1032 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
1033 @_check_name |
| 76877 | 1034 def load_module(self, fullname): |
| 1035 """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
|
1036 # 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
|
1037 # 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
|
1038 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
|
1039 |
|
52139
2e8e897a1244
Make utility code in importlib._bootstrap private.
Brett Cannon <bcannon@gmail.com>
parents:
52115
diff
changeset
|
1040 @_check_name |
|
62587
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1041 def get_filename(self, fullname): |
|
b07b2c954a80
Move importlib.abc.SourceLoader to _bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
61692
diff
changeset
|
1042 """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
|
1043 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
|
1044 |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1045 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
|
1046 """Return the data from path as raw bytes.""" |
|
64407
f8ba9558adbf
Remove redundant context manager.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
64291
diff
changeset
|
1047 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
|
1048 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
|
1049 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1050 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1051 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
|
1052 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1053 """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
|
1054 |
|
74358
87331661042b
Issue #13645: pyc files now contain the size of the corresponding source
Antoine Pitrou <solipsis@pitrou.net>
parents:
73977
diff
changeset
|
1055 def path_stats(self, path): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
1056 """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
|
1057 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
|
1058 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
|
1059 |
|
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
|
1060 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
|
1061 # Adapt between the two APIs |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1062 try: |
|
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1063 mode = _os.stat(source_path).st_mode |
|
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1064 except OSError: |
|
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1065 mode = 0o666 |
|
79832
bbb3459fbcb8
Issue #6074: Apply an appropriate fix for importlib based imports
Nick Coghlan <ncoghlan@gmail.com>
parents:
79741
diff
changeset
|
1066 # We always ensure write access so we can update cached files |
|
bbb3459fbcb8
Issue #6074: Apply an appropriate fix for importlib based imports
Nick Coghlan <ncoghlan@gmail.com>
parents:
79741
diff
changeset
|
1067 # later even when the source files are read-only on Windows (#6074) |
|
bbb3459fbcb8
Issue #6074: Apply an appropriate fix for importlib based imports
Nick Coghlan <ncoghlan@gmail.com>
parents:
79741
diff
changeset
|
1068 mode |= 0o200 |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1069 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
|
1070 |
|
78738
0c661c5632e0
Issue #2051: Tweak last commit for this issue to pass in mode instead
Brett Cannon <brett@python.org>
parents:
78722
diff
changeset
|
1071 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
|
1072 """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
|
1073 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
|
1074 path_parts = [] |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1075 # 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
|
1076 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
|
1077 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
|
1078 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
|
1079 # Create needed directories. |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1080 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
|
1081 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
|
1082 try: |
|
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1083 _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
|
1084 except FileExistsError: |
|
64240
cf399de12b54
One of the joys of having test_multiprocessing occasionally execute after
Brett Cannon <bcannon@gmail.com>
parents:
62761
diff
changeset
|
1085 # 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
|
1086 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
|
1087 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
|
1088 # 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
|
1089 # 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
|
1090 _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
|
1091 return |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1092 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
|
1093 _write_atomic(path, data, _mode) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1094 _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
|
1095 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
|
1096 # 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
|
1097 _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
|
1098 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1099 |
|
76548
a2cf07135e4f
Issue #14605: Rename _SourcelessFileLoader to SourcelessFileLoader.
Marc-Andre Lemburg <mal@egenix.com>
parents:
76547
diff
changeset
|
1100 class SourcelessFileLoader(FileLoader, _LoaderBasics): |
|
55355
dfaf6de2c8ce
Implement the PEP 302 protocol for get_filename() as
Brett Cannon <bcannon@gmail.com>
parents:
52633
diff
changeset
|
1101 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1102 """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
|
1103 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1104 def load_module(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1105 return self._load_module(fullname, sourceless=True) |
|
51771
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1106 |
|
ee7029710c05
Refactor source and bytecode file loaders in importlib so that there
Brett Cannon <bcannon@gmail.com>
parents:
51770
diff
changeset
|
1107 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
|
1108 path = self.get_filename(fullname) |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1109 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
|
1110 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
|
1111 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
|
1112 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1113 def get_source(self, fullname): |
|
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1114 """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
|
1115 return None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1116 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1117 |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1118 # 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
|
1119 EXTENSION_SUFFIXES = [] |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1120 |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1121 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1122 class ExtensionFileLoader: |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1123 |
|
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
|
1124 """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
|
1125 |
|
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
|
1126 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
|
1127 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1128 """ |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1129 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1130 def __init__(self, name, path): |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1131 self.name = name |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1132 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
|
1133 |
|
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
|
1134 @_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
|
1135 @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
|
1136 @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
|
1137 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
|
1138 """Load an extension module.""" |
|
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 is_reload = fullname in sys.modules |
|
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
|
1140 try: |
|
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
|
1141 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
|
1142 fullname, self.path) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1143 _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
|
1144 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
|
1145 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
|
1146 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
|
1147 except: |
|
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 if not is_reload and fullname in sys.modules: |
|
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 del sys.modules[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
|
1150 raise |
|
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 |
|
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
|
1152 def is_package(self, fullname): |
|
78491
f7b59e890e30
fix docstring wording
Philip Jenvey <pjenvey@underboss.org>
parents:
78489
diff
changeset
|
1153 """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
|
1154 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
|
1155 return any(file_name == '__init__' + suffix |
|
e024f6ba5ed8
update docstring per the extension package fix, refactor
Philip Jenvey <pjenvey@underboss.org>
parents:
78486
diff
changeset
|
1156 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
|
1157 |
|
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
|
1158 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
|
1159 """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
|
1160 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
|
1161 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1162 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
|
1163 """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
|
1164 return None |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1165 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1166 |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1167 class _NamespacePath: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1168 """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
|
1169 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
|
1170 __path__. When this changes, the module's own path is recomputed, |
| 80409 | 1171 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
|
1172 is sys.path.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1173 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1174 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
|
1175 self._name = name |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1176 self._path = path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1177 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
|
1178 self._path_finder = path_finder |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1179 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1180 def _find_parent_path_names(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1181 """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
|
1182 parent, dot, me = self._name.rpartition('.') |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1183 if dot == '': |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1184 # 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
|
1185 return 'sys', 'path' |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1186 # 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
|
1187 # parent path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1188 return parent, '__path__' |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1189 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1190 def _get_parent_path(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1191 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
|
1192 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
|
1193 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1194 def _recalculate(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1195 # 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
|
1196 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
|
1197 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
|
1198 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
|
1199 # 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
|
1200 # do remember the new parent path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1201 if loader is None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1202 self._path = new_path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1203 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
|
1204 return self._path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1205 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1206 def __iter__(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1207 return iter(self._recalculate()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1208 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1209 def __len__(self): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1210 return len(self._recalculate()) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1211 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1212 def __repr__(self): |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1213 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
|
1214 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1215 def __contains__(self, item): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1216 return item in self._recalculate() |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1217 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1218 def append(self, item): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1219 self._path.append(item) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1220 |
|
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 class NamespaceLoader: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1223 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
|
1224 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
|
1225 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1226 @classmethod |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1227 def module_repr(cls, module): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1228 return "<module '{}' (namespace)>".format(module.__name__) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1229 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1230 @module_for_loader |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1231 def load_module(self, module): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1232 """Load a namespace module.""" |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1233 _verbose_message('namespace module loaded with path {!r}', self._path) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1234 module.__path__ = self._path |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1235 return module |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1236 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1237 |
|
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
|
1238 # Finders ##################################################################### |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1239 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1240 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
|
1241 |
|
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
|
1242 """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
|
1243 |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1244 @classmethod |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1245 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
|
1246 """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
|
1247 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
|
1248 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
|
1249 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
|
1250 finder.invalidate_caches() |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1251 |
|
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1252 @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
|
1253 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
|
1254 """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
|
1255 |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1256 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
|
1257 |
|
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
|
1258 """ |
|
76566
57d558f1904d
Issue #14605: Make explicit the entries on sys.path_hooks that used to
Brett Cannon <brett@python.org>
parents:
76549
diff
changeset
|
1259 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
|
1260 _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
|
1261 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
|
1262 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
|
1263 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
|
1264 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
|
1265 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
|
1266 else: |
|
76582
7025ee00dbf6
Issue #14605: Use None in sys.path_importer_cache to represent no
Brett Cannon <brett@python.org>
parents:
76579
diff
changeset
|
1267 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
|
1268 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1269 @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
|
1270 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
|
1271 """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
|
1272 |
|
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
|
1273 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
|
1274 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
|
1275 |
|
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
|
1276 """ |
|
74994
b8593ec7e8c5
Tweak the handling of the empty string in sys.path for importlib.
Brett Cannon <brett@python.org>
parents:
74992
diff
changeset
|
1277 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
|
1278 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
|
1279 try: |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1280 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
|
1281 except KeyError: |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1282 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
|
1283 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
|
1284 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
|
1285 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1286 @classmethod |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1287 def _get_loader(cls, fullname, path): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1288 """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
|
1289 # 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
|
1290 # 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
|
1291 namespace_path = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1292 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
|
1293 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
|
1294 continue |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1295 finder = cls._path_importer_cache(entry) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1296 if finder is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1297 if hasattr(finder, 'find_loader'): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1298 loader, portions = finder.find_loader(fullname) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1299 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1300 loader = finder.find_module(fullname) |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1301 portions = [] |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1302 if loader is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1303 # 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
|
1304 return loader, namespace_path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1305 # 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
|
1306 # 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
|
1307 # 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
|
1308 # on path. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1309 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
|
1310 else: |
|
78485
0a75ce232f56
Issue #15502: Finish bringing importlib.abc in line with the current
Brett Cannon <brett@python.org>
parents:
78456
diff
changeset
|
1311 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
|
1312 |
|
51322
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1313 @classmethod |
|
53d6445c6c5a
Rename importlib._bootstrap.SysPathFinder to PathFinder and expose off of
Brett Cannon <bcannon@gmail.com>
parents:
51266
diff
changeset
|
1314 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
|
1315 """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
|
1316 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
|
1317 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
|
1318 path = sys.path |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1319 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
|
1320 if loader is not None: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1321 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
|
1322 else: |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1323 if namespace_path: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1324 # 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
|
1325 # 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
|
1326 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
|
1327 else: |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1328 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
|
1329 |
|
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
|
1330 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1331 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
|
1332 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1333 """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
|
1334 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1335 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
|
1336 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
|
1337 |
|
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
|
1338 """ |
|
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
|
1339 |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1340 def __init__(self, path, *details): |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1341 """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
|
1342 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
|
1343 recognizes.""" |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1344 loaders = [] |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1345 for loader, suffixes in details: |
|
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1346 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
|
1347 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
|
1348 # 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
|
1349 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
|
1350 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
|
1351 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
|
1352 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
|
1353 |
|
75324
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1354 def invalidate_caches(self): |
|
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1355 """Invalidate the directory mtime.""" |
|
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1356 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
|
1357 |
|
78489
e7a67f1bf604
Issue #15502: Refactor some code.
Brett Cannon <brett@python.org>
parents:
78487
diff
changeset
|
1358 find_module = _find_module_shim |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1359 |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1360 def find_loader(self, fullname): |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1361 """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
|
1362 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
|
1363 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
|
1364 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
|
1365 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
|
1366 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
|
1367 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
|
1368 mtime = -1 |
|
75324
de125ee32897
Update importlib.invalidate_caches() to be more general.
Brett Cannon <brett@python.org>
parents:
75250
diff
changeset
|
1369 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
|
1370 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
|
1371 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
|
1372 # 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
|
1373 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
|
1374 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
|
1375 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
|
1376 else: |
|
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1377 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
|
1378 cache_module = tail_module |
| 76309 | 1379 # 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
|
1380 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
|
1381 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
|
1382 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
|
1383 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
|
1384 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
|
1385 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
|
1386 if _path_isfile(full_path): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1387 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
|
1388 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
|
1389 # 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
|
1390 # 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
|
1391 is_namespace = True |
| 76309 | 1392 # 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
|
1393 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
|
1394 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
|
1395 _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
|
1396 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
|
1397 if _path_isfile(full_path): |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1398 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
|
1399 if is_namespace: |
|
83055
ac89e7bc0e2f
Issue #17357: Add missing verbosity messages when running under
Brett Cannon <brett@python.org>
parents:
82236
diff
changeset
|
1400 _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
|
1401 return (None, [base_path]) |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
77013
diff
changeset
|
1402 return (None, []) |
|
62756
34d827249ce0
Make importlib.abc.SourceLoader the primary mechanism for importlib.
Brett Cannon <bcannon@gmail.com>
parents:
62587
diff
changeset
|
1403 |
|
75048
bbaab666e6c7
Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75045
diff
changeset
|
1404 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
|
1405 """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
|
1406 path = self.path |
|
78663
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1407 try: |
|
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1408 contents = _os.listdir(path) |
|
81427
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1409 except (FileNotFoundError, PermissionError, NotADirectoryError): |
|
159967aa24a5
Issue #16730: Don't raise an exception in
Brett Cannon <brett@python.org>
parents:
80929
diff
changeset
|
1410 # 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
|
1411 # unreadable. |
|
78663
bfd04bfb55c5
Close #14846: Handle a sys.path entry going away
Nick Coghlan <ncoghlan@gmail.com>
parents:
78619
diff
changeset
|
1412 contents = [] |
|
75082
3297dcdad196
Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems
Antoine Pitrou <solipsis@pitrou.net>
parents:
75070
diff
changeset
|
1413 # 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
|
1414 # 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
|
1415 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
|
1416 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
|
1417 else: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1418 # 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
|
1419 # 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
|
1420 # 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
|
1421 # 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
|
1422 # 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
|
1423 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
|
1424 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
|
1425 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
|
1426 if dot: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1427 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
|
1428 else: |
|
a32be109bd86
Issue #14581: Windows users are allowed to import modules w/o taking
Brett Cannon <brett@python.org>
parents:
76406
diff
changeset
|
1429 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
|
1430 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
|
1431 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
|
1432 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
|
1433 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
|
1434 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1435 @classmethod |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1436 def path_hook(cls, *loader_details): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1437 """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
|
1438 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
|
1439 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
|
1440 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1441 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
|
1442 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
|
1443 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1444 """ |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1445 def path_hook_for_FileFinder(path): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1446 """Path hook for importlib.machinery.FileFinder.""" |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1447 if not _path_isdir(path): |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1448 raise ImportError("only directories are supported", path=path) |
|
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1449 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
|
1450 |
|
76478
1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and
Brett Cannon <brett@python.org>
parents:
76472
diff
changeset
|
1451 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
|
1452 |
|
77600
df856963fc6c
A better repr() for FileFinder
Antoine Pitrou <solipsis@pitrou.net>
parents:
77457
diff
changeset
|
1453 def __repr__(self): |
|
79692
987a8724b220
Remove uses of % with str.format.
Brett Cannon <brett@python.org>
parents:
79653
diff
changeset
|
1454 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
|
1455 |
|
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1456 |
|
52140
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
1457 # Import itself ############################################################### |
|
1a8bbc5fb3ef
Do a little bit of reorganization on importlib._bootstrap.
Brett Cannon <bcannon@gmail.com>
parents:
52139
diff
changeset
|
1458 |
|
52141
f188dd68620e
Last big re-organization of importlib._bootstrap. Should actually be able to find something in the file now.
Brett Cannon <bcannon@gmail.com>
parents:
52140
diff
changeset
|
1459 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
|
1460 |
|
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
|
1461 """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
|
1462 |
|
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
|
1463 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
|
1464 """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
|
1465 _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
|
1466 |
|
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 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
|
1468 """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
|
1469 _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
|
1470 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1471 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1472 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
|
1473 """Resolve a relative module name to an absolute one.""" |
|
75250
8840037a9c53
unused imports, pep8
Philip Jenvey <pjenvey@underboss.org>
parents:
75239
diff
changeset
|
1474 bits = package.rsplit('.', level - 1) |
|
75239
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1475 if len(bits) < level: |
|
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1476 raise ValueError('attempted relative import beyond top-level package') |
|
5cfc9c97af23
Simplify importib._resolve_name().
Brett Cannon <brett@python.org>
parents:
75235
diff
changeset
|
1477 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
|
1478 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
|
1479 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1480 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1481 def _find_module(name, path): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1482 """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
|
1483 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
|
1484 _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
|
1485 for finder in sys.meta_path: |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1486 with _ImportLockContext(): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1487 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
|
1488 if loader is not None: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1489 # 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
|
1490 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
|
1491 return loader |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1492 else: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1493 return sys.modules[name].__loader__ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1494 else: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1495 return None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1496 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1497 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1498 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
|
1499 """Verify arguments are "sane".""" |
|
75228
909935a236e3
Do a type check instead of an interface check.
Brett Cannon <brett@python.org>
parents:
75193
diff
changeset
|
1500 if not isinstance(name, str): |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1501 raise TypeError("module name must be str, not {}".format(type(name))) |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1502 if level < 0: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1503 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
|
1504 if package: |
|
75228
909935a236e3
Do a type check instead of an interface check.
Brett Cannon <brett@python.org>
parents:
75193
diff
changeset
|
1505 if not isinstance(package, str): |
|
75229
8d1040fdac60
Improper type for __package__ should raise TypeError, not ValueError.
Brett Cannon <brett@python.org>
parents:
75228
diff
changeset
|
1506 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
|
1507 elif package not in sys.modules: |
|
77964
37850f083af5
Minor refactoring in importlib._bootstrap, and fix the '_wrap' docstring.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
77917
diff
changeset
|
1508 msg = ("Parent module {!r} not loaded, cannot perform relative " |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1509 "import") |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1510 raise SystemError(msg.format(package)) |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1511 if not name and level == 0: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1512 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
|
1513 |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1514 |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1515 _ERR_MSG = 'No module named {!r}' |
|
51639
ef2cba80c975
Change importlib.machinery.PathFinder to not have implicit semantics (that's
Brett Cannon <bcannon@gmail.com>
parents:
51433
diff
changeset
|
1516 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1517 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
|
1518 path = None |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1519 parent = name.rpartition('.')[0] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1520 if parent: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1521 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
|
1522 _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
|
1523 # 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
|
1524 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
|
1525 return sys.modules[name] |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1526 # 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
|
1527 parent_module = sys.modules[parent] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1528 try: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1529 path = parent_module.__path__ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1530 except AttributeError: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1531 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
|
1532 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
|
1533 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
|
1534 if loader is None: |
|
78758
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1535 exc = ImportError(_ERR_MSG.format(name), name=name) |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1536 # TODO(brett): switch to a proper ModuleNotFound exception in Python |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1537 # 3.4. |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1538 exc._not_found = True |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1539 raise exc |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1540 elif name not in sys.modules: |
|
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1541 # 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
|
1542 loader.load_module(name) |
|
76753
59b8a7fcb047
Properly mark names in importlib._bootstrap as private.
Brett Cannon <brett@python.org>
parents:
76586
diff
changeset
|
1543 _verbose_message('import {!r} # {!r}', name, loader) |
|
76390
db5e3431ee4c
rollback 005fd1fe31ab (see #14609 and #14582)
Benjamin Peterson <benjamin@python.org>
parents:
76384
diff
changeset
|
1544 # 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
|
1545 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
|
1546 if parent: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1547 # 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
|
1548 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
|
1549 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
|
1550 # 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
|
1551 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
|
1552 try: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1553 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
|
1554 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
|
1555 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
|
1556 except AttributeError: |
|
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1557 pass |
|
76586
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1558 # 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
|
1559 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
|
1560 try: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1561 module.__loader__ = loader |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1562 except AttributeError: |
|
496c68f90a03
Issue #14646: __import__() now sets __loader__ if need be.
Brett Cannon <brett@python.org>
parents:
76582
diff
changeset
|
1563 pass |
|
75193
f95faebf5dea
Refactor importlib to make it easier to re-implement in C.
Brett Cannon <brett@python.org>
parents:
75185
diff
changeset
|
1564 return module |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1565 |
|
66226
af13fb6fb3df
Fix a minor inconsistency in capitalization for the 'No module named' exception
Brett Cannon <bcannon@gmail.com>
parents:
64407
diff
changeset
|
1566 |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1567 def _find_and_load(name, import_): |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1568 """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
|
1569 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1570 lock = _get_module_lock(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1571 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1572 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1573 lock.acquire() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1574 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1575 return _find_and_load_unlocked(name, import_) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1576 finally: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1577 lock.release() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1578 |
|
66226
af13fb6fb3df
Fix a minor inconsistency in capitalization for the 'No module named' exception
Brett Cannon <bcannon@gmail.com>
parents:
64407
diff
changeset
|
1579 |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1580 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
|
1581 """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
|
1582 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
|
1583 |
|
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1584 This function represents the greatest common denominator of functionality |
| 68447 | 1585 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
|
1586 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
|
1587 |
|
51383
a00e5dcea16c
Initial, untested stab at writing a common denominator function for __import__
Brett Cannon <bcannon@gmail.com>
parents:
51356
diff
changeset
|
1588 """ |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1589 _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
|
1590 if level > 0: |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1591 name = _resolve_name(name, package, level) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1592 _imp.acquire_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1593 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
|
1594 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
|
1595 module = sys.modules[name] |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1596 if module is None: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1597 _imp.release_lock() |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1598 message = ("import of {} halted; " |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1599 "None in sys.modules".format(name)) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1600 raise ImportError(message, name=name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1601 _lock_unlock_module(name) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1602 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1603 |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1604 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
|
1605 """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
|
1606 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1607 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
|
1608 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
|
1609 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
|
1610 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1611 """ |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1612 # The hell that is fromlist ... |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1613 # 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
|
1614 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
|
1615 if '*' in fromlist: |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1616 fromlist = list(fromlist) |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1617 fromlist.remove('*') |
|
78051
dc18a2a66d16
Issue #15111: When a module was imported using a 'from import'
Brett Cannon <brett@python.org>
parents:
78042
diff
changeset
|
1618 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
|
1619 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
|
1620 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
|
1621 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
|
1622 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
|
1623 try: |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1624 _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
|
1625 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
|
1626 # 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
|
1627 # 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
|
1628 # exist. |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1629 # TODO(brett): In Python 3.4, have import raise |
|
ca4bf8e10bc0
Issue #15316: Let exceptions raised during imports triggered by the
Brett Cannon <brett@python.org>
parents:
78738
diff
changeset
|
1630 # ModuleNotFound and catch that. |
|
79652
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1631 if getattr(exc, '_not_found', False): |
|
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1632 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
|
1633 continue |
|
09b5158d5284
Closes issue #15111: Calling __import__ with a module specified in
Brett Cannon <brett@python.org>
parents:
79228
diff
changeset
|
1634 raise |
|
75235
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1635 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1636 |
|
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1637 |
|
74983
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1638 def _calc___package__(globals): |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1639 """Calculate what __package__ should be. |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1640 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1641 __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
|
1642 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
|
1643 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1644 """ |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1645 package = globals.get('__package__') |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1646 if package is None: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1647 package = globals['__name__'] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1648 if '__path__' not in globals: |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1649 package = package.rpartition('.')[0] |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1650 return package |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1651 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1652 |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1653 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
|
1654 """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
|
1655 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1656 Each item is a tuple (loader, suffixes, allow_packages). |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1657 """ |
|
78486
1db6553f3f8c
Issue #15576: Allow extension modules to be a package's __init__
Brett Cannon <brett@python.org>
parents:
78485
diff
changeset
|
1658 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
|
1659 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
|
1660 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
|
1661 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
|
1662 |
|
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1663 |
|
78456
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1664 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
|
1665 """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
|
1666 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1667 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
|
1668 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
|
1669 '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
|
1670 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
|
1671 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
|
1672 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
|
1673 |
|
51426
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1674 """ |
|
7a1356d2aeef
Rewrite the code implementing __import__ for importlib. Now it is much simpler
Brett Cannon <bcannon@gmail.com>
parents:
51383
diff
changeset
|
1675 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
|
1676 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
|
1677 else: |
|
78456
4240282a9f4a
Issue #15471: Don't use mutable object as default values for the
Brett Cannon <brett@python.org>
parents:
78382
diff
changeset
|
1678 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
|
1679 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
|
1680 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
|
1681 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
|
1682 # 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
|
1683 # 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
|
1684 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
|
1685 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
|
1686 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
|
1687 return module |
|
50845
aac51b70c74c
Add initial implementation of importlib. See the NOTES files for what is
Brett Cannon <bcannon@gmail.com>
parents:
diff
changeset
|
1688 else: |
| 79228 | 1689 # Figure out where to slice the module's name up to the first dot |
| 1690 # 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
|
1691 cut_off = len(name) - len(name.partition('.')[0]) |
| 79228 | 1692 # Slice end needs to be positive to alleviate need to special-case |
| 1693 # when ``'.' not in name``. | |
|
76312
9e8cbf07068a
Handle importing pkg.mod by executing
Brett Cannon <brett@python.org>
parents:
76309
diff
changeset
|
1694 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
|
1695 else: |
|
3670df23081d
Turn _return_module() into _handle_fromlist().
Brett Cannon <brett@python.org>
parents:
75229
diff
changeset
|
1696 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
|
1697 |
|
03140936913c
Refactor importlib.__import__() and _gcd_import() to facilitate using
Brett Cannon <brett@python.org>
parents:
74935
diff
changeset
|
1698 |
|
76445
c820aa9c0c00
Issue #13959: Keep imp.get_magic() in C code, but cache in importlib
Brett Cannon <brett@python.org>
parents:
76428
diff
changeset
|
1699 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1700 def _setup(sys_module, _imp_module): |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1701 """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
|
1702 into the global namespace. |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1703 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1704 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
|
1705 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
|
1706 |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1707 """ |
|
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
|
1708 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
|
1709 _imp = _imp_module |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1710 sys = sys_module |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1711 |
|
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
|
1712 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
|
1713 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
|
1714 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
|
1715 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
|
1716 |
|
81869
05747d3bcd9c
Issue #17098: Make sure every module has __loader__ defined.
Brett Cannon <brett@python.org>
parents:
81427
diff
changeset
|
1717 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
|
1718 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
|
1719 if isinstance(module, module_type): |
|
05747d3bcd9c
Issue #17098: Make sure every module has __loader__ defined.
Brett Cannon <brett@python.org>
parents:
81427
diff
changeset
|
1720 if not hasattr(module, '__loader__'): |
|
81884
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1721 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
|
1722 module.__loader__ = BuiltinImporter |
|
19ea454ccdf7
Issue #17098: Be more stringent of setting __loader__ on early imported
Brett Cannon <brett@python.org>
parents:
81869
diff
changeset
|
1723 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
|
1724 module.__loader__ = FrozenImporter |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1725 |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1726 self_module = sys.modules[__name__] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1727 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
|
1728 if builtin_name not in sys.modules: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1729 builtin_module = BuiltinImporter.load_module(builtin_name) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1730 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1731 builtin_module = sys.modules[builtin_name] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1732 setattr(self_module, builtin_name, builtin_module) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1733 |
|
79480
15949f34e08f
#16135: Removal of OS/2 support (Python code partial cleanup)
Jesus Cea <jcea@jcea.es>
parents:
79228
diff
changeset
|
1734 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
|
1735 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
|
1736 # 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
|
1737 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
|
1738 path_sep = path_separators[0] |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1739 if builtin_os in sys.modules: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1740 os_module = sys.modules[builtin_os] |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1741 break |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1742 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1743 try: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1744 os_module = BuiltinImporter.load_module(builtin_os) |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1745 break |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1746 except ImportError: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1747 continue |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1748 else: |
|
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1749 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
|
1750 |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1751 try: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1752 thread_module = BuiltinImporter.load_module('_thread') |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1753 except ImportError: |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1754 # Python was built without threads |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1755 thread_module = None |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1756 weakref_module = BuiltinImporter.load_module('_weakref') |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1757 |
|
78308
bd58c421057c
Issue #14578: Support modules registered in the Windows registry again.
Martin v. Löwis <martin@v.loewis.de>
parents:
78112
diff
changeset
|
1758 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
|
1759 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
|
1760 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
|
1761 |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1762 setattr(self_module, '_os', os_module) |
|
77013
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1763 setattr(self_module, '_thread', thread_module) |
|
edb9ce3a6c2e
Issue #9260: A finer-grained import lock.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76877
diff
changeset
|
1764 setattr(self_module, '_weakref', weakref_module) |
|
74839
322e6f818cd2
Move setup code from importlib.__init__ to
Brett Cannon <brett@python.org>
parents:
74838
diff
changeset
|
1765 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
|
1766 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
|
1767 # Constants |
|
75055
b8576719fe71
_relax_case -> _make_relax_case
Antoine Pitrou <solipsis@pitrou.net>
parents:
75048
diff
changeset
|
1768 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
|
1769 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
|
1770 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
|
1771 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
|
1772 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
|
1773 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
|
1774 |
|
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
|
1775 |
|
76331
d777f854a66e
Issue #13959: Rename imp to _imp and add Lib/imp.py and begin
Brett Cannon <brett@python.org>
parents:
76330
diff
changeset
|
1776 def _install(sys_module, _imp_module): |
| 76765 | 1777 """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
|
1778 _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
|
1779 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
|
1780 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
|
1781 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
|
1782 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
|
1783 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
|
1784 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
|
1785 sys.meta_path.append(PathFinder) |
