From: Antoine Pitrou Date: Sat, 26 Nov 2011 21:02:29 +0000 (+0100) Subject: Issue #13444: When stdout has been closed explicitly, we should not attempt to flush... X-Git-Tag: v3.3.0a1~725 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5604ef3e36756e59d3396ed16d7a94de2687e0ac;p=python Issue #13444: When stdout has been closed explicitly, we should not attempt to flush it at shutdown and print an error. This also adds a test for issue #5319, whose resolution introduced the issue. --- 5604ef3e36756e59d3396ed16d7a94de2687e0ac diff --cc Lib/test/test_cmd_line.py index 9738691693,8167e78b9a..52e715c8be --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@@ -266,6 -272,25 +266,25 @@@ class CmdLineTest(unittest.TestCase) self.assertRegex(err.decode('ascii', 'ignore'), 'SyntaxError') self.assertEqual(b'', out) + def test_stdout_flush_at_shutdown(self): + # Issue #5319: if stdout.flush() fails at shutdown, an error should + # be printed out. + code = """if 1: + import os, sys + sys.stdout.write('x') + os.close(sys.stdout.fileno())""" + rc, out, err = assert_python_ok('-c', code) + self.assertEqual(b'', out) + self.assertRegex(err.decode('ascii', 'ignore'), - 'Exception IOError: .* ignored') ++ 'Exception OSError: .* ignored') + + def test_closed_stdout(self): + # Issue #13444: if stdout has been explicitly closed, we should + # not attempt to flush it at shutdown. + code = "import sys; sys.stdout.close()" + rc, out, err = assert_python_ok('-c', code) + self.assertEqual(b'', err) + def test_main(): test.support.run_unittest(CmdLineTest) diff --cc Misc/NEWS index c60cea0bbd,eaadaafb03..ceb3582eac --- a/Misc/NEWS +++ b/Misc/NEWS @@@ -395,10 -83,9 +395,13 @@@ Core and Builtin Library ------- + - Issue #13444: When stdout has been closed explicitly, we should not attempt + to flush it at shutdown and print an error. + +- Issue #12567: The curses module uses Unicode functions for Unicode arguments + when it is linked to the ncurses library. It encodes also Unicode strings to + the locale encoding instead of UTF-8. + - Issue #12856: Ensure child processes do not inherit the parent's random seed for filename generation in the tempfile module. Patch by Brian Harring. diff --cc Python/pythonrun.c index 389bcd08ec,fe92d303c8..4956943f50 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@@ -354,18 -354,17 +370,18 @@@ flush_std_files(void PyObject *fout = PySys_GetObject("stdout"); PyObject *ferr = PySys_GetObject("stderr"); PyObject *tmp; + _Py_IDENTIFIER(flush); - if (fout != NULL && fout != Py_None) { + if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { - tmp = PyObject_CallMethod(fout, "flush", ""); + tmp = _PyObject_CallMethodId(fout, &PyId_flush, ""); if (tmp == NULL) PyErr_WriteUnraisable(fout); else Py_DECREF(tmp); } - if (ferr != NULL && ferr != Py_None) { + if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) { - tmp = PyObject_CallMethod(ferr, "flush", ""); + tmp = _PyObject_CallMethodId(ferr, &PyId_flush, ""); if (tmp == NULL) PyErr_Clear(); else