Mercurial > cpython-lru_cache-weakref
diff Python/import.c @ 47944:b90752c5e8c1 legacy-trunk
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)
| author | Nick Coghlan <ncoghlan@gmail.com> |
|---|---|
| date | Sun, 13 Jul 2008 14:52:36 +0000 |
| parents | 52294af4b663 |
| children | 53ade9e68b56 |
line wrap: on
line diff
--- a/Python/import.c Sun Jul 13 12:36:42 2008 +0000 +++ b/Python/import.c Sun Jul 13 14:52:36 2008 +0000 @@ -2160,6 +2160,7 @@ 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 @@ 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
