diff -r 736ad9629d53 Python/import.c --- a/Python/import.c Mon Jun 25 07:40:32 2012 +0200 +++ b/Python/import.c Mon Jun 25 22:14:29 2012 +0200 @@ -8,6 +8,7 @@ #include "errcode.h" #include "marshal.h" #include "code.h" +#include "frameobject.h" #include "osdefs.h" #include "importdl.h" @@ -1374,6 +1375,32 @@ } +/* Remove importlib frames from the traceback, + * except in Verbose mode. */ +static void +remove_importlib_frames(void) +{ + PyObject *exception, *value, *tb; + PyErr_Fetch(&exception, &value, &tb); + if (exception && !Py_VerboseFlag) { + while (tb != NULL && PyTraceBack_Check(tb)) { + PyTracebackObject *traceback = (PyTracebackObject *)tb; + PyFrameObject *frame = traceback->tb_frame; + PyCodeObject *code = frame->f_code; + if (PyUnicode_CompareWithASCIIString( + code->co_filename, + "") != 0) + break; + PyObject *next = (PyObject *)traceback->tb_next; + Py_XINCREF(next); + Py_DECREF(tb); + tb = next; + } + } + PyErr_Restore(exception, value, tb); +} + + PyObject * PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, PyObject *locals, PyObject *given_fromlist, @@ -1692,6 +1719,8 @@ Py_XDECREF(package); Py_XDECREF(globals); Py_XDECREF(fromlist); + if (final_mod == NULL) + remove_importlib_frames(); return final_mod; }