Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4e0d98

Browse files
committed
Close issue #16163: handle submodules in pkgutil.iter_importers
1 parent 8157459 commit c4e0d98

3 files changed

Lines changed: 44 additions & 2 deletions

File tree

Lib/pkgutil.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,8 +451,8 @@ def iter_importers(fullname=""):
451451
if '.' in fullname:
452452
# Get the containing package's __path__
453453
pkg_name = fullname.rpartition(".")[0]
454-
pkg = importlib.import_module(pkg)
455-
path = getattr(sys.modules[pkg], '__path__', None)
454+
pkg = importlib.import_module(pkg_name)
455+
path = getattr(pkg, '__path__', None)
456456
if path is None:
457457
return
458458
else:

Lib/test/test_pkgutil.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import unittest
33
import sys
44
import imp
5+
import importlib
56
import pkgutil
67
import os
78
import os.path
@@ -187,6 +188,44 @@ def test_simple(self):
187188
del sys.modules['foo.bar']
188189
del sys.modules['foo.baz']
189190

191+
192+
# Another awful testing hack to be cleaned up once the test_runpy
193+
# helpers are factored out to a common location
194+
def test_iter_importers(self):
195+
iter_importers = pkgutil.iter_importers
196+
get_importer = pkgutil.get_importer
197+
198+
pkgname = 'spam'
199+
modname = 'eggs'
200+
dirname = self.create_init(pkgname)
201+
pathitem = os.path.join(dirname, pkgname)
202+
fullname = '{}.{}'.format(pkgname, modname)
203+
try:
204+
self.create_submodule(dirname, pkgname, modname, 0)
205+
206+
importlib.import_module(fullname)
207+
208+
importers = list(iter_importers(fullname))
209+
expected_importer = get_importer(pathitem)
210+
for finder in importers:
211+
self.assertIsInstance(finder, importlib.machinery.FileFinder)
212+
self.assertEqual(finder, expected_importer)
213+
self.assertIsInstance(finder.find_module(fullname),
214+
importlib.machinery.SourceFileLoader)
215+
self.assertIsNone(finder.find_module(pkgname))
216+
217+
with self.assertRaises(ImportError):
218+
list(iter_importers('invalid.module'))
219+
220+
with self.assertRaises(ImportError):
221+
list(iter_importers('.spam'))
222+
finally:
223+
shutil.rmtree(dirname)
224+
del sys.path[0]
225+
del sys.modules['spam']
226+
del sys.modules['spam.eggs']
227+
228+
190229
def test_mixed_namespace(self):
191230
pkgname = 'foo'
192231
dirname_0 = self.create_init(pkgname)

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ Core and Builtins
2929
Library
3030
-------
3131

32+
- Issue #16163: Make the importlib based version of pkgutil.iter_importers
33+
work for submodules. Initial patch by Berker Peksag.
34+
3235
- Issue #16804: Fix a bug in the 'site' module that caused running
3336
'python -S -m site' to incorrectly throw an exception.
3437

0 commit comments

Comments
 (0)