mirror of https://github.com/python/cpython
Close issue #16163: handle submodules in pkgutil.iter_importers
This commit is contained in:
parent
8157459d6b
commit
c4e0d982f3
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue