diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -745,15 +745,15 @@ """Meta path finder for sys.(path|path_hooks|path_importer_cache).""" @classmethod - def _path_hooks(cls, path, hooks=None): + def _path_hooks(cls, path): """Search sequence of hooks for a finder for 'path'. If 'hooks' is false then use sys.path_hooks. """ - if hooks is None: - hooks = sys.path_hooks - for hook in hooks: + if not sys.path_hooks: + _warnings.warn('sys.path_hooks is empty', ImportWarning) + for hook in sys.path_hooks: try: return hook(path) except ImportError: @@ -763,14 +763,11 @@ path=path) @classmethod - def _path_importer_cache(cls, path, default=None): + def _path_importer_cache(cls, path): """Get the finder for the path from sys.path_importer_cache. If the path is not in the cache, find the appropriate finder and cache - it. If None is cached, get the default finder and cache that - (if applicable). - - Because of NullImporter, some finder should be returned. The only + it. Because of NullImporter, some finder should be returned. The only explicit fail case is if None is cached but the path cannot be used for the default hook, for which ImportError is raised. @@ -783,9 +780,11 @@ finder = cls._path_hooks(path) sys.path_importer_cache[path] = finder else: - if finder is None and default: - # Raises ImportError on failure. - finder = default(path) + if finder is None: + msg = "'None' in sys.path_importer_cache[{!r}]".format(path) + _warnings.warn(msg, ImportWarning) + del sys.path_importer_cache[path] + finder = cls._path_hooks(path) sys.path_importer_cache[path] = finder return finder @@ -924,29 +923,6 @@ # Import itself ############################################################### -_DEFAULT_PATH_HOOK = None # Set in _setup() - -class _DefaultPathFinder(PathFinder): - - """Subclass of PathFinder that implements implicit semantics for - __import__.""" - - @classmethod - def _path_hooks(cls, path): - """Search sys.path_hooks as well as implicit path hooks.""" - try: - return super()._path_hooks(path) - except ImportError: - implicit_hooks = [_DEFAULT_PATH_HOOK, _imp.NullImporter] - return super()._path_hooks(path, implicit_hooks) - - @classmethod - def _path_importer_cache(cls, path): - """Use the default path hook when None is stored in - sys.path_importer_cache.""" - return super()._path_importer_cache(path, _DEFAULT_PATH_HOOK) - - class _ImportLockContext: """Context manager for the import lock.""" @@ -1001,7 +977,7 @@ raise ValueError("Empty module name") -_IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder] +_IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, PathFinder] _ERR_MSG = 'No module named {!r}' @@ -1196,12 +1172,6 @@ if builtin_os == 'nt': SOURCE_SUFFIXES.append('.pyw') - supported_loaders = [(ExtensionFileLoader, _suffix_list(3), False), - (SourceFileLoader, _suffix_list(1), True), - (SourcelessFileLoader, _suffix_list(2), True)] - setattr(self_module, '_DEFAULT_PATH_HOOK', - FileFinder.path_hook(*supported_loaders)) - def _install(sys_module, _imp_module): """Install importlib as the implementation of import. @@ -1211,6 +1181,8 @@ """ _setup(sys_module, _imp_module) - orig_import = builtins.__import__ - builtins.__import__ = __import__ - builtins.__original_import__ = orig_import + supported_loaders = [(ExtensionFileLoader, _suffix_list(3), False), + (SourceFileLoader, _suffix_list(1), True), + (SourcelessFileLoader, _suffix_list(2), True)] + sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders), + _imp.NullImporter]) diff --git a/Lib/importlib/test/import_/test_fromlist.py b/Lib/importlib/test/import_/test_fromlist.py --- a/Lib/importlib/test/import_/test_fromlist.py +++ b/Lib/importlib/test/import_/test_fromlist.py @@ -1,6 +1,7 @@ """Test that the semantics relating to the 'fromlist' argument are correct.""" from .. import util from . import util as import_util +import imp import unittest class ReturnValue(unittest.TestCase): @@ -73,7 +74,8 @@ def test_no_module_from_package(self): # [no module] with util.mock_modules('pkg.__init__') as importer: - with util.import_state(meta_path=[importer]): + with util.import_state(meta_path=[importer], + path_hooks=[imp.NullImporter]): module = import_util.import_('pkg', fromlist='non_existent') self.assertEqual(module.__name__, 'pkg') self.assertTrue(not hasattr(module, 'non_existent')) diff --git a/Lib/importlib/test/import_/test_path.py b/Lib/importlib/test/import_/test_path.py --- a/Lib/importlib/test/import_/test_path.py +++ b/Lib/importlib/test/import_/test_path.py @@ -9,6 +9,7 @@ from test import support from types import MethodType import unittest +import warnings class FinderTests(unittest.TestCase): @@ -78,9 +79,16 @@ module = '' importer = util.mock_modules(module) with util.import_state(path=['1', '2'], - path_importer_cache={'1': None, '2': importer}): - loader = machinery.PathFinder.find_module(module) - self.assertTrue(loader is importer) + path_importer_cache={'1': None, '2': importer}, + path_hooks=[imp.NullImporter]): + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter('always') + loader = machinery.PathFinder.find_module(module) + self.assertTrue(loader is importer) + self.assertEqual(len(w), 1) + warned = w[0] + self.assertTrue(issubclass(warned.category, ImportWarning)) + self.assertIn(repr(None), str(warned.message)) def test_path_importer_cache_empty_string(self): # The empty string should create a finder using the cwd. @@ -94,57 +102,9 @@ self.assertIn(os.curdir, sys.path_importer_cache) -class DefaultPathFinderTests(unittest.TestCase): - - """Test _bootstrap._DefaultPathFinder.""" - - def test_implicit_hooks(self): - # Test that the implicit path hooks are used. - bad_path = '' - module = '' - assert not os.path.exists(bad_path) - existing_path = tempfile.mkdtemp() - try: - with util.import_state(): - nothing = _bootstrap._DefaultPathFinder.find_module(module, - path=[existing_path]) - self.assertTrue(nothing is None) - self.assertTrue(existing_path in sys.path_importer_cache) - result = isinstance(sys.path_importer_cache[existing_path], - imp.NullImporter) - self.assertFalse(result) - nothing = _bootstrap._DefaultPathFinder.find_module(module, - path=[bad_path]) - self.assertTrue(nothing is None) - self.assertTrue(bad_path in sys.path_importer_cache) - self.assertTrue(isinstance(sys.path_importer_cache[bad_path], - imp.NullImporter)) - finally: - os.rmdir(existing_path) - - - def test_path_importer_cache_has_None(self): - # Test that the default hook is used when sys.path_importer_cache - # contains None for a path. - module = '' - importer = util.mock_modules(module) - path = '' - # XXX Not blackbox. - original_hook = _bootstrap._DEFAULT_PATH_HOOK - mock_hook = import_util.mock_path_hook(path, importer=importer) - _bootstrap._DEFAULT_PATH_HOOK = mock_hook - try: - with util.import_state(path_importer_cache={path: None}): - loader = _bootstrap._DefaultPathFinder.find_module(module, - path=[path]) - self.assertTrue(loader is importer) - finally: - _bootstrap._DEFAULT_PATH_HOOK = original_hook - - def test_main(): from test.support import run_unittest - run_unittest(FinderTests, DefaultPathFinderTests) + run_unittest(FinderTests) if __name__ == '__main__': test_main() diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -379,18 +379,15 @@ for path_hook in sys.path_hooks: try: importer = path_hook(path_item) + sys.path_importer_cache.setdefault(path_item, importer) break except ImportError: pass else: - importer = None - sys.path_importer_cache.setdefault(path_item, importer) - - if importer is None: - try: - importer = ImpImporter(path_item) - except ImportError: - importer = None + try: + importer = ImpImporter(path_item) + except ImportError: + importer = None return importer diff --git a/Lib/runpy.py b/Lib/runpy.py --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -9,6 +9,7 @@ # Written by Nick Coghlan # to implement PEP 338 (Executing Modules as Scripts) +import os import sys import imp from pkgutil import read_code @@ -94,7 +95,7 @@ for attr in ("get_filename", "_get_filename"): meth = getattr(loader, attr, None) if meth is not None: - return meth(mod_name) + return os.path.abspath(meth(mod_name)) return None # Helper to get the loader, code and filename for a module @@ -198,10 +199,6 @@ try: importer = cache[path_name] except KeyError: - # Not yet cached. Flag as using the - # standard machinery until we finish - # checking the hooks - cache[path_name] = None for hook in sys.path_hooks: try: importer = hook(path_name) @@ -213,10 +210,7 @@ # NullImporter throws ImportError if the supplied path is a # *valid* directory entry (and hence able to be handled # by the standard import machinery) - try: - importer = imp.NullImporter(path_name) - except ImportError: - return None + importer = imp.NullImporter(path_name) cache[path_name] = importer return importer diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -1,5 +1,6 @@ # tests command line execution of scripts +import importlib import unittest import sys import os @@ -49,12 +50,16 @@ """ def _make_test_script(script_dir, script_basename, source=test_source): - return make_script(script_dir, script_basename, source) + to_return = make_script(script_dir, script_basename, source) + importlib.invalidate_caches() + return to_return def _make_test_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source=test_source, depth=1): - return make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, - source, depth) + to_return = make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, + source, depth) + importlib.invalidate_caches() + return to_return # There's no easy way to pass the script directory in to get # -m to work (avoiding that is the whole point of making @@ -72,7 +77,9 @@ else: path = repr(path) source = launch_source % (path, module_name) - return make_script(script_dir, script_basename, source) + to_return = make_script(script_dir, script_basename, source) + importlib.invalidate_caches() + return to_return class CmdLineTest(unittest.TestCase): def _check_output(self, script_name, exit_code, data, diff --git a/Python/importlib.h b/Python/importlib.h index 8bc0d8128cdbb869055d5c9ddfb53b6cbc17e32d..b80a203db2086cd7d9b447a510daf8b89ced9f84 GIT binary patch literal 169644 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 diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -229,7 +229,7 @@ Py_FatalError("Py_Initialize: can't save _imp to sys.modules"); } - value = PyObject_CallMethod(importlib, "_setup", "OO", sysmod, impmod); + value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); if (value == NULL) { PyErr_Print(); Py_FatalError("Py_Initialize: importlib install failed");