diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2013-04-14 13:01:11 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2013-04-14 13:01:11 (GMT) |
commit | 685bd4a37a22678b3f97bbbc24da908696c9fcd5 (patch) | |
tree | 32b4925e07b42a9d3b77fc525fd16240f19352e1 | |
parent | 8b4c7198dbc0f61a58822a5be92355a5206cd0b6 (diff) | |
parent | c4e0d982f3b967973553c99722b1e4002c8b35f6 (diff) | |
download | cpython-685bd4a37a22678b3f97bbbc24da908696c9fcd5.zip cpython-685bd4a37a22678b3f97bbbc24da908696c9fcd5.tar.gz cpython-685bd4a37a22678b3f97bbbc24da908696c9fcd5.tar.bz2 |
Merge fix for #16163 from 3.3
-rw-r--r-- | Lib/pkgutil.py | 4 | ||||
-rw-r--r-- | Lib/test/test_pkgutil.py | 39 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 44 insertions, 2 deletions
diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index 8fa8405..1901a5b 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -449,8 +449,8 @@ def iter_importers(fullname=""): if '.' in fullname: # Get the containing package's __path__ pkg_name = fullname.rpartition(".")[0] - pkg = importlib.import_module(pkg) - path = getattr(sys.modules[pkg], '__path__', None) + pkg = importlib.import_module(pkg_name) + path = getattr(pkg, '__path__', None) if path is None: return else: diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py index 88e2d33..fd06614 100644 --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -2,6 +2,7 @@ from test.support import run_unittest, unload, check_warnings import unittest import sys import imp +import importlib import pkgutil import os import os.path @@ -187,6 +188,44 @@ class ExtendPathTests(unittest.TestCase): del sys.modules['foo.bar'] del sys.modules['foo.baz'] + + # Another awful testing hack to be cleaned up once the test_runpy + # helpers are factored out to a common location + def test_iter_importers(self): + iter_importers = pkgutil.iter_importers + get_importer = pkgutil.get_importer + + pkgname = 'spam' + modname = 'eggs' + dirname = self.create_init(pkgname) + pathitem = os.path.join(dirname, pkgname) + fullname = '{}.{}'.format(pkgname, modname) + try: + self.create_submodule(dirname, pkgname, modname, 0) + + importlib.import_module(fullname) + + importers = list(iter_importers(fullname)) + expected_importer = get_importer(pathitem) + for finder in importers: + self.assertIsInstance(finder, importlib.machinery.FileFinder) + self.assertEqual(finder, expected_importer) + self.assertIsInstance(finder.find_module(fullname), + importlib.machinery.SourceFileLoader) + self.assertIsNone(finder.find_module(pkgname)) + + with self.assertRaises(ImportError): + list(iter_importers('invalid.module')) + + with self.assertRaises(ImportError): + list(iter_importers('.spam')) + finally: + shutil.rmtree(dirname) + del sys.path[0] + del sys.modules['spam'] + del sys.modules['spam.eggs'] + + def test_mixed_namespace(self): pkgname = 'foo' dirname_0 = self.create_init(pkgname) @@ -46,6 +46,9 @@ Core and Builtins Library ------- +- Issue #16163: Make the importlib based version of pkgutil.iter_importers + work for submodules. Initial patch by Berker Peksag. + - Issue #16804: Fix a bug in the 'site' module that caused running 'python -S -m site' to incorrectly throw an exception. |