diff -r dc0811953034 Python/pylifecycle.c --- a/Python/pylifecycle.c Fri Mar 25 12:50:54 2016 +0100 +++ b/Python/pylifecycle.c Fri Mar 25 14:10:29 2016 +0100 @@ -508,6 +508,42 @@ flush_std_files(void) return status; } +static void +close_stdio(const char *name) +{ + PyObject *file, *tmp; + + file = PySys_GetObject(name); + if (file == NULL || file == Py_None) + return; + + tmp = PyObject_CallMethod(file, "close", ""); + if (tmp != NULL) { + Py_DECREF(tmp); + } + else { + PyErr_Clear(); + } +} + +static void +replace_stdio(int fd, const char *name, const char *dunder_name) +{ + PyObject *std_file; + + std_file = PyFile_NewStdPrinter(fd); + if (std_file == NULL) { + PyErr_Clear(); + return; + } + + close_stdio(name); + + PySys_SetObject(name, std_file); + PySys_SetObject(dunder_name, std_file); + Py_DECREF(std_file); +} + /* Undo the effect of Py_Initialize(). Beware: if multiple interpreter and/or thread states exist, these @@ -582,6 +618,13 @@ Py_FinalizeEx(void) while (PyGC_Collect() > 0) /* nothing */; #endif + + /* Close stdin, stdout and stderr objects. + Replace stdout and stderr with new standard printer objects. */ + close_stdio("stdin"); + replace_stdio(fileno(stdout), "stdout", "__stdout__"); + replace_stdio(fileno(stderr), "stderr", "__stderr__"); + /* Destroy all modules */ PyImport_Cleanup();