Skip to content

Commit 6aaba14

Browse files
Fix it
1 parent 62e3c16 commit 6aaba14

File tree

4 files changed

+31
-10
lines changed

4 files changed

+31
-10
lines changed

Lib/importlib/_bootstrap.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,14 +843,21 @@ def _setup_module(cls, module):
843843
spec.loader_state.origname = origname
844844

845845
@classmethod
846-
def _resolve_filename(cls, fullname, ispkg):
846+
def _resolve_filename(cls, fullname, alias=None, ispkg=False):
847847
if not fullname or not getattr(sys, '_stdlib_dir', None):
848848
return None, None
849849
try:
850850
sep = cls._SEP
851851
except AttributeError:
852852
sep = cls._SEP = '\\' if sys.platform == 'win32' else '/'
853853

854+
if fullname != alias:
855+
if fullname.startswith('<'):
856+
fullname = fullname[1:]
857+
if not ispkg:
858+
fullname = f'{fullname}.__init__'
859+
else:
860+
ispkg = False
854861
relfile = fullname.replace('.', sep)
855862
if ispkg:
856863
pkgdir = f'{sys._stdlib_dir}{sep}{relfile}'
@@ -869,7 +876,7 @@ def find_spec(cls, fullname, path=None, target=None):
869876
spec = spec_from_loader(fullname, cls,
870877
origin=cls._ORIGIN,
871878
is_package=ispkg)
872-
filename, pkgdir = cls._resolve_filename(origname, ispkg)
879+
filename, pkgdir = cls._resolve_filename(origname, fullname, ispkg)
873880
spec.loader_state = type(sys.implementation)(
874881
data=data,
875882
filename=filename,

Lib/test/test_frozen.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@ def test_frozen_submodule_in_unfrozen_package(self):
3939
self.assertIs(spam.__spec__.loader,
4040
importlib.machinery.FrozenImporter)
4141

42-
# This is not possible until frozen packages have __path__ set properly.
43-
# See https://bugs.python.org/issue21736.
44-
@unittest.expectedFailure
4542
def test_unfrozen_submodule_in_frozen_package(self):
4643
with import_helper.CleanImport('__phello__', '__phello__.spam'):
4744
with import_helper.frozen_modules(enabled=True):

Lib/test/test_importlib/frozen/test_finder.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,24 @@ def check_loader_state(self, spec, origname=None, filename=None):
6262
# Check the rest of spec.loader_state.
6363
expected = dict(
6464
origname=origname,
65-
filename=filename,
65+
filename=filename if origname else None,
6666
)
6767
self.assertDictEqual(actual, expected)
6868

69-
def check_search_location(self, spec):
69+
def check_search_locations(self, spec):
70+
"""This is only called when testing packages."""
7071
missing = object()
7172
filename = getattr(spec.loader_state, 'filename', missing)
72-
if filename is missing:
73+
origname = getattr(spec.loader_state, 'origname', None)
74+
if not origname or filename is missing:
7375
# We deal with this in check_loader_state().
7476
return
75-
expected = [os.path.dirname(filename)] if filename else []
77+
if not filename:
78+
expected = []
79+
elif origname != spec.name and not origname.startswith('<'):
80+
expected = []
81+
else:
82+
expected = [os.path.dirname(filename)]
7683
self.assertListEqual(spec.submodule_search_locations, expected)
7784

7885
def test_module(self):

Lib/test/test_importlib/frozen/test_loader.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
machinery = util.import_importlib('importlib.machinery')
55

6-
from test.support import captured_stdout, import_helper
6+
from test.support import captured_stdout, import_helper, STDLIB_DIR
77
import _imp
88
import contextlib
99
import marshal
10+
import os.path
1011
import types
1112
import unittest
1213
import warnings
@@ -30,6 +31,14 @@ def fresh(name, *, oldapi=False):
3031
yield
3132

3233

34+
def resolve_stdlib_file(name, ispkg=False):
35+
assert name
36+
if ispkg:
37+
return os.path.join(STDLIB_DIR, *name.split('.'), '__init__.py')
38+
else:
39+
return os.path.join(STDLIB_DIR, *name.split('.')) + '.py'
40+
41+
3342
class ExecModuleTests(abc.LoaderTests):
3443

3544
def exec_module(self, name, origname=None):
@@ -44,6 +53,7 @@ def exec_module(self, name, origname=None):
4453
loader_state=types.SimpleNamespace(
4554
data=marshal.dumps(code),
4655
origname=origname or name,
56+
filename=resolve_stdlib_file(origname or name, is_package),
4757
),
4858
)
4959
module = types.ModuleType(name)

0 commit comments

Comments
 (0)