self.assertIn("Frozen object named 'x' is invalid",
str(cm.exception))
+ def test_frozen_module_from_import_error(self):
+ with self.assertRaises(ImportError) as cm:
+ from os import this_will_never_exist
+ self.assertIn(
+ f"cannot import name 'this_will_never_exist' from 'os' ({os.__file__})",
+ str(cm.exception),
+ )
+ with self.assertRaises(ImportError) as cm:
+ from sys import this_will_never_exist
+ self.assertIn(
+ "cannot import name 'this_will_never_exist' from 'sys' (unknown location)",
+ str(cm.exception),
+ )
+
+ scripts = [
+ """
+import os
+os.__spec__.has_location = False
+os.__file__ = []
+from os import this_will_never_exist
+""",
+ """
+import os
+os.__spec__.has_location = False
+del os.__file__
+from os import this_will_never_exist
+""",
+ """
+import os
+os.__spec__.origin = []
+os.__file__ = []
+from os import this_will_never_exist
+"""
+ ]
+ for script in scripts:
+ with self.subTest(script=script):
+ expected_error = (
+ b"cannot import name 'this_will_never_exist' "
+ b"from 'os' (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 = [
(
except AttributeError as e:
print(str(e))
-fractions.__spec__.origin = 0
+fractions.__spec__.origin = []
try:
fractions.Fraction
except AttributeError as e:
except ImportError as e:
print(str(e))
-fractions.__spec__.origin = 0
+fractions.__spec__.origin = []
try:
from fractions import Fraction
except ImportError as e:
}
}
+ if (origin == NULL) {
+ // Fall back to __file__ for diagnostics if we don't have
+ // an origin that is a location
+ origin = PyModule_GetFilenameObject(v);
+ if (origin == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
+ goto done;
+ }
+ // PyModule_GetFilenameObject raised "module filename missing"
+ _PyErr_Clear(tstate);
+ }
+ assert(origin == NULL || PyUnicode_Check(origin));
+ }
+
if (is_possibly_shadowing_stdlib) {
assert(origin);
errmsg = PyUnicode_FromFormat(
}
done_with_errmsg:
- /* NULL checks for errmsg, mod_name, origin done by PyErr_SetImportError. */
- _PyErr_SetImportErrorWithNameFrom(errmsg, mod_name, origin, name);
- Py_DECREF(errmsg);
+ if (errmsg != NULL) {
+ /* NULL checks for mod_name and origin done by _PyErr_SetImportErrorWithNameFrom */
+ _PyErr_SetImportErrorWithNameFrom(errmsg, mod_name, origin, name);
+ Py_DECREF(errmsg);
+ }
done:
Py_XDECREF(origin);