From 038f8d5decc842fbd37ea6dda8d6b9fcb0a70944 Mon Sep 17 00:00:00 2001 From: David Wilson Date: Sun, 8 Jul 2018 21:45:50 +0100 Subject: [PATCH] master: fix another case where built-in module loader throws ImportError requests/packages.py just imports urllib3 normally, then makes up new names for it. pkgutil can't cope with that, and returns the loader (builtin) for the requests package. The built-in loader obviously can't find_module() for "requests/packages/urllib3/contrib/pyopenssl" because it doesn't exist on disk. --- mitogen/master.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mitogen/master.py b/mitogen/master.py index 04464a5d..d057f7f1 100644 --- a/mitogen/master.py +++ b/mitogen/master.py @@ -350,7 +350,17 @@ class ModuleFinder(object): path = self._py_filename(loader.get_filename(fullname)) source = loader.get_source(fullname) is_pkg = loader.is_package(fullname) - except AttributeError: + except (AttributeError, ImportError): + # - Per PEP-302, get_source() and is_package() are optional, + # calling them may throw AttributeError. + # - get_filename() may throw ImportError if pkgutil.find_loader() + # picks a "parent" package's loader for some crap that's been + # stuffed in sys.modules, for example in the case of urllib3: + # "loader for urllib3.contrib.pyopenssl cannot handle + # requests.packages.urllib3.contrib.pyopenssl" + e = sys.exc_info()[1] + LOG.debug('%r: loading %r using %r failed: %s', + self, fullname, loader) return if path is None or source is None: