mirror of https://github.com/python/cpython.git
gh-128030: Avoid error from PyModule_GetFilenameObject for non-module (#128047)
I missed the extra `PyModule_Check` in #127660 because I was looking at 3.12 as the base implementation for import from. This meant that I missed the `PyModuleCheck` introduced in #112661.
This commit is contained in:
parent
daa260ebb1
commit
45e6dd63b8
|
@ -851,6 +851,29 @@ def test_frozen_module_from_import_error(self):
|
||||||
stdout, stderr = popen.communicate()
|
stdout, stderr = popen.communicate()
|
||||||
self.assertIn(expected_error, stdout)
|
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):
|
def test_script_shadowing_stdlib(self):
|
||||||
script_errors = [
|
script_errors = [
|
||||||
(
|
(
|
||||||
|
|
|
@ -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.
|
|
@ -2860,7 +2860,7 @@ _PyEval_ImportFrom(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
|
// Fall back to __file__ for diagnostics if we don't have
|
||||||
// an origin that is a location
|
// an origin that is a location
|
||||||
origin = PyModule_GetFilenameObject(v);
|
origin = PyModule_GetFilenameObject(v);
|
||||||
|
|
Loading…
Reference in New Issue