mirror of
https://github.com/python/cpython.git
synced 2025-08-01 23:53:15 +00:00
Fix issue 3221 by emitting a RuntimeWarning instead of raising SystemError when the parent module can't be found during an absolute import (likely due to non-PEP 361 aware code which sets a module level __package__ attribute)
This commit is contained in:
parent
12c8660cc6
commit
b028f50911
3 changed files with 61 additions and 6 deletions
|
@ -2160,6 +2160,7 @@ get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
|
|||
static PyObject *pathstr = NULL;
|
||||
static PyObject *pkgstr = NULL;
|
||||
PyObject *pkgname, *modname, *modpath, *modules, *parent;
|
||||
int orig_level = level;
|
||||
|
||||
if (globals == NULL || !PyDict_Check(globals) || !level)
|
||||
return Py_None;
|
||||
|
@ -2285,9 +2286,27 @@ get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
|
|||
|
||||
modules = PyImport_GetModuleDict();
|
||||
parent = PyDict_GetItemString(modules, buf);
|
||||
if (parent == NULL)
|
||||
PyErr_Format(PyExc_SystemError,
|
||||
"Parent module '%.200s' not loaded", buf);
|
||||
if (parent == NULL) {
|
||||
if (orig_level < 1) {
|
||||
PyObject *err_msg = PyString_FromFormat(
|
||||
"Parent module '%.200s' not found "
|
||||
"while handling absolute import", buf);
|
||||
if (err_msg == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (!PyErr_WarnEx(PyExc_RuntimeWarning,
|
||||
PyString_AsString(err_msg), 1)) {
|
||||
*buf = '\0';
|
||||
*p_buflen = 0;
|
||||
parent = Py_None;
|
||||
}
|
||||
Py_DECREF(err_msg);
|
||||
} else {
|
||||
PyErr_Format(PyExc_SystemError,
|
||||
"Parent module '%.200s' not loaded, "
|
||||
"cannot perform relative import", buf);
|
||||
}
|
||||
}
|
||||
return parent;
|
||||
/* We expect, but can't guarantee, if parent != None, that:
|
||||
- parent.__name__ == buf
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue