Skip to content

Commit

Permalink
pythongh-128030: Avoid error from PyModule_GetFilenameObject for non-…
Browse files Browse the repository at this point in the history
…module (pythonGH-128047)

I missed the extra `PyModule_Check` in pythonGH-127660 because I was looking at
3.12 as the base implementation for import from. This meant that I
missed the `PyModuleCheck` introduced in pythonGH-112661.
(cherry picked from commit 45e6dd6)

Co-authored-by: Shantanu <[email protected]>
  • Loading branch information
hauntsaninja authored and miss-islington committed Dec 20, 2024
1 parent 3a8bdaf commit 76b88e6
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 1 deletion.
23 changes: 23 additions & 0 deletions Lib/test/test_import/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,29 @@ def test_frozen_module_from_import_error(self):
stdout, stderr = popen.communicate()
self.assertIn(expected_error, stdout)

def test_non_module_from_import_error(self):
prefix = """
import sys
class NotAModule: ...
nm = NotAModule()
nm.symbol = 123
sys.modules["not_a_module"] = nm
from not_a_module import symbol
"""
scripts = [
prefix + "from not_a_module import missing_symbol",
prefix + "nm.__spec__ = []\nfrom not_a_module import missing_symbol",
]
for script in scripts:
with self.subTest(script=script):
expected_error = (
b"ImportError: cannot import name 'missing_symbol' from "
b"'<unknown module name>' (unknown location)"
)
popen = script_helper.spawn_python("-c", script)
stdout, stderr = popen.communicate()
self.assertIn(expected_error, stdout)

def test_script_shadowing_stdlib(self):
script_errors = [
(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Avoid error from calling ``PyModule_GetFilenameObject`` on a non-module object when importing a non-existent symbol from a non-module object.
2 changes: 1 addition & 1 deletion Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -2781,7 +2781,7 @@ import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
}
}

if (origin == NULL) {
if (origin == NULL && PyModule_Check(v)) {
// Fall back to __file__ for diagnostics if we don't have
// an origin that is a location
origin = PyModule_GetFilenameObject(v);
Expand Down

0 comments on commit 76b88e6

Please sign in to comment.