diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -74,6 +74,24 @@ class TestCase(unittest.TestCase): self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) self.assertIn("ZeroDivisionError", self.stream.getvalue()) + def test_print_tracebacks(self): + def f(): + 1/0 # one + def g(): + 1/0 # two + def h(): + 1/0 # three + atexit.register(f) + atexit.register(g) + atexit.register(h) + + self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) + stderr = self.stream.getvalue() + self.assertEqual(stderr.count("ZeroDivisionError"), 3) + self.assertIn("# one", stderr) + self.assertIn("# two", stderr) + self.assertIn("# three", stderr) + def test_stress(self): a = [0] def inc(): diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1880,6 +1880,8 @@ PyErr_Display(PyObject *exception, PyObj { PyObject *seen; PyObject *f = PySys_GetObject("stderr"); + if (tb != NULL && PyTraceBack_Check(tb)) + PyException_SetTraceback(value, tb); if (f == Py_None) { /* pass */ }