diff -r bb7363b8b50e Lib/test/test_import/__init__.py --- a/Lib/test/test_import/__init__.py Fri Sep 11 11:31:07 2015 -0700 +++ b/Lib/test/test_import/__init__.py Fri Sep 11 14:05:29 2015 -0700 @@ -1125,6 +1125,12 @@ from test.test_import.data.circular_imports.subpkg import util self.assertIs(util.util, rebinding.util) + def test_wildcard(self): + try: + import test.test_import.data.circular_imports.wildcard + except (ImportError, AttributeError): + self.fail('circular import with a wildcard failed') + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. diff -r bb7363b8b50e Python/ceval.c --- a/Python/ceval.c Fri Sep 11 11:31:07 2015 -0700 +++ b/Python/ceval.c Fri Sep 11 14:05:29 2015 -0700 @@ -5110,8 +5110,10 @@ { _Py_IDENTIFIER(__all__); _Py_IDENTIFIER(__dict__); + _Py_IDENTIFIER(__name__); PyObject *all = _PyObject_GetAttrId(v, &PyId___all__); PyObject *dict, *name, *value; + PyObject *fullmodname, *pkgname; int skip_leading_underscores = 0; int pos, err; @@ -5153,7 +5155,41 @@ } value = PyObject_GetAttr(v, name); if (value == NULL) - err = -1; + { + if (!PyErr_ExceptionMatches(PyExc_AttributeError) || + !PyUnicode_Check(name)) { + err = -1; + } + else { + /* Issue #23477: If a circular import happens within a wildcard + import, some partially loaded modules may not have been saved + to the package's __dict__ yet, so try getting them from + sys.modules before giving up. */ + PyErr_Clear(); + pkgname = _PyObject_GetAttrId(v, &PyId___name__); + if (pkgname != NULL && PyUnicode_Check(pkgname)) { + fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name); + if (fullmodname == NULL) { + err = -1; + } + else { + value = PyDict_GetItem(PyImport_GetModuleDict(), + fullmodname); + if (value == NULL) { + PyErr_Format(PyExc_ImportError, + "cannot import name %R", + fullmodname); + err = -1; + } + else { + Py_INCREF(value); + } + Py_DECREF(fullmodname); + } + Py_DECREF(pkgname); + } + } + } else if (PyDict_CheckExact(locals)) err = PyDict_SetItem(locals, name, value); else