Close issue #16163: handle submodules in pkgutil.iter_importers

This commit is contained in:
Nick Coghlan 2013-04-14 22:30:42 +10:00
parent 8157459d6b
commit c4e0d982f3
3 changed files with 44 additions and 2 deletions

View File

@ -451,8 +451,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:

View File

@ -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)

View File

@ -29,6 +29,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.