diff options
-rw-r--r-- | Lib/importlib/__init__.py | 23 | ||||
-rw-r--r-- | Lib/test/test_import.py | 20 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 37 insertions, 9 deletions
diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index 90e163c..e62bdb1 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -1,21 +1,28 @@ """A pure Python implementation of import.""" __all__ = ['__import__', 'import_module', 'invalidate_caches'] -from . import _bootstrap +# Bootstrap help ##################################################### +import imp +import sys +try: + _bootstrap = sys.modules['_frozen_importlib'] +except ImportError: + from . import _bootstrap + _bootstrap._setup(sys, imp) +else: + # importlib._bootstrap is the built-in import, ensure we don't create + # a second copy of the module. + _bootstrap.__name__ = 'importlib._bootstrap' + _bootstrap.__package__ = 'importlib' + _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py') + sys.modules['importlib._bootstrap'] = _bootstrap # To simplify imports in test code _w_long = _bootstrap._w_long _r_long = _bootstrap._r_long -# Bootstrap help ##################################################### -import imp -import sys - -_bootstrap._setup(sys, imp) - - # Public API ######################################################### from ._bootstrap import __import__ diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index 01441ad..7ae690b 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -19,7 +19,7 @@ import test.support from test.support import ( EnvironmentVarGuard, TESTFN, check_warnings, forget, is_jython, make_legacy_pyc, rmtree, run_unittest, swap_attr, swap_item, temp_umask, - unlink, unload, create_empty_file) + unlink, unload, create_empty_file, cpython_only) from test import script_helper @@ -746,6 +746,23 @@ class TestSymbolicallyLinkedPackage(unittest.TestCase): sys.path[:] = self.orig_sys_path +@cpython_only +class ImportlibBootstrapTests(unittest.TestCase): + # These tests check that importlib is bootstrapped. + + def test_frozen_importlib(self): + mod = sys.modules['_frozen_importlib'] + self.assertTrue(mod) + + def test_frozen_importlib_is_bootstrap(self): + from importlib import _bootstrap + mod = sys.modules['_frozen_importlib'] + self.assertIs(mod, _bootstrap) + self.assertEqual(mod.__name__, 'importlib._bootstrap') + self.assertEqual(mod.__package__, 'importlib') + self.assertTrue(mod.__file__.endswith('_bootstrap.py'), mod.__file__) + + def test_main(verbose=None): flag = importlib_util.using___import__ try: @@ -753,6 +770,7 @@ def test_main(verbose=None): run_unittest(ImportTests, PycacheTests, PycRewritingTests, PathsTests, RelativeImportTests, OverridingImportBuiltinTests, + ImportlibBootstrapTests, TestSymbolicallyLinkedPackage, importlib_import_test_suite()) finally: @@ -29,6 +29,9 @@ Core and Builtins Library ------- +- Issue #14657: The frozen instance of importlib used for bootstrap is now + also the module imported as importlib._bootstrap. + - Issue #14055: Add __sizeof__ support to _elementtree. - Issue #15054: A bug in tokenize.tokenize that caused string literals |