diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -1,7 +1,15 @@ """A pure Python implementation of import.""" __all__ = ['__import__', 'import_module', 'invalidate_caches'] -from . import _bootstrap + +import sys +from . import _bootstrap as _pure_bootstrap +try: + import _frozen_importlib as _bootstrap + sys.modules['importlib._bootstrap'] = _bootstrap +except ImportError: + _bootstrap = _pure_bootstrap + # To simplify imports in test code @@ -9,16 +17,9 @@ _r_long = _bootstrap._r_long -# Bootstrap help ##################################################### -import imp -import sys - -_bootstrap._setup(sys, imp) - - # Public API ######################################################### -from ._bootstrap import __import__ +__import__ = _bootstrap.__import__ def invalidate_caches(): diff --git a/Lib/importlib/test/util.py b/Lib/importlib/test/util.py --- a/Lib/importlib/test/util.py +++ b/Lib/importlib/test/util.py @@ -24,6 +24,34 @@ "requires a case-insensitive filesystem")(test) +def set_bootstrap(importlib, bootstrap): + """Set importlib to use the passed bootstrap module.""" + importlib._w_long = bootstrap._w_long + importlib._r_long = bootstrap._r_long + importlib._bootstrap = bootstrap + importlib.__import__ = bootstrap.__import__ + sys.modules['importlib._bootstrap'] = bootstrap + + +@contextmanager +def bootstrap_context(importlib, bootstrap): + """Temporarily use an alternate bootstrap module.""" + old_bootstrap = importlib._bootstrap + try: + set_bootstrap(importlib, bootstrap) + yield + finally: + set_bootstrap(importlib, old_bootstrap) + + +def pure_bootstrap_context(importlib): + """Temporarily use importlib._bootstrap.""" + # importlib._bootstrap will normally be the same as _frozen_importlib + if not hasattr(importlib._pure_bootstrap, 'sys'): + importlib._pure_bootstrap._setup(sys, imp) + return bootstrap_context(importlib, importlib._pure_bootstrap) + + @contextmanager def uncache(*names): """Uncache a module from sys.modules.