From: Victor Stinner Date: Tue, 28 May 2019 14:01:17 +0000 (+0200) Subject: bpo-36829: sys.excepthook and sys.unraisablehook flush (GH-13620) X-Git-Tag: v3.8.0b1~165 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a85a1d337d26a65036e427341d15e3979f7e9ced;p=thirdparty%2FPython%2Fcpython.git bpo-36829: sys.excepthook and sys.unraisablehook flush (GH-13620) sys.excepthook() and sys.unraisablehook() now explicitly flush the file (usually sys.stderr). If file.flush() fails, sys.excepthook() silently ignores the error, whereas sys.unraisablehook() logs the new exception. --- diff --git a/Python/errors.c b/Python/errors.c index bd33d4d340f6..8a94afdd8c41 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -26,6 +26,7 @@ extern "C" { _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); +_Py_IDENTIFIER(flush); /* Forward declarations */ @@ -1254,6 +1255,14 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, if (PyFile_WriteString("\n", file) < 0) { return -1; } + + /* Explicitly call file.flush() */ + PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + if (!res) { + return -1; + } + Py_DECREF(res); + return 0; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index ba1d1cf02f25..ace9f2f9874e 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -978,6 +978,16 @@ _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *t } print_exception_recursive(file, value, seen); Py_XDECREF(seen); + + /* Call file.flush() */ + PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + if (!res) { + /* Silently ignore file.flush() error */ + PyErr_Clear(); + } + else { + Py_DECREF(res); + } } void