diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -428,6 +428,7 @@ PyImport_Cleanup(void) PyObject *key, *value, *dict; PyInterpreterState *interp = PyThreadState_GET()->interp; PyObject *modules = interp->modules; + PyObject *sys_stdout; if (modules == NULL) return; /* Already done */ @@ -528,6 +529,28 @@ PyImport_Cleanup(void) } } + /* Flush stdout to make sure errors get logged before stderr goes */ + sys_stdout = PySys_GetObject("stdout"); + if (sys_stdout == NULL) + PyErr_Clear(); + else if (sys_stdout != Py_None) { + int closed = -1; + value = PyObject_GetAttrString(sys_stdout, "closed"); + if (value != NULL) { + closed = PyObject_IsTrue(value); + Py_DECREF(value); + } + if (closed == -1) + PyErr_WriteUnraisable(sys_stdout); + else if (closed == 0) { + value = PyObject_CallMethod(sys_stdout, "flush", ""); + if (value == NULL) + PyErr_WriteUnraisable(sys_stdout); + else + Py_DECREF(value); + } + } + /* Next, delete sys and __builtin__ (in that order) */ value = PyDict_GetItemString(modules, "sys"); if (value != NULL && PyModule_Check(value)) {