summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/importlib/__init__.py23
-rw-r--r--Lib/test/test_import.py20
-rw-r--r--Misc/NEWS3
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:
diff --git a/Misc/NEWS b/Misc/NEWS
index c6ba9dd..3321b24 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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