]> granicus.if.org Git - python/commitdiff
Upon exit, flush stdout and stderr (twice: before and after the code that
authorGuido van Rossum <guido@python.org>
Mon, 9 Jul 2007 15:04:50 +0000 (15:04 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 9 Jul 2007 15:04:50 +0000 (15:04 +0000)
attempts to delete all modules).  This makes test_subprocess work again.
(I can't quite figure out why stdout/stderr don't get deleted properly,
which would flush them anyway, but that's a separate issue.)

Python/pythonrun.c

index db21dafaae96bb4b95ba28f62fe3be039cbe60bd..d8bc6466bf6c0cb70a16e474e1af20d89500f077 100644 (file)
@@ -291,6 +291,32 @@ Py_Initialize(void)
 extern void dump_counts(FILE*);
 #endif
 
+/* Flush stdout and stderr */
+
+void
+flush_std_files()
+{
+       PyObject *fout = PySys_GetObject("stdout");
+       PyObject *ferr = PySys_GetObject("stderr");
+       PyObject *tmp;
+
+       if (fout != NULL) {
+               tmp = PyObject_CallMethod(fout, "flush", "");
+               if (tmp == NULL)
+                       PyErr_Clear();
+               else
+                       Py_DECREF(tmp);
+       }
+
+       if (ferr != NULL) {
+               tmp = PyObject_CallMethod(ferr, "flush", "");
+               if (tmp == NULL)
+                       PyErr_Clear();
+               else
+                       Py_DECREF(tmp);
+       }
+}
+
 /* Undo the effect of Py_Initialize().
 
    Beware: if multiple interpreter and/or thread states exist, these
@@ -326,6 +352,9 @@ Py_Finalize(void)
        call_py_exitfuncs();
        initialized = 0;
 
+       /* Flush stdout+stderr */
+       flush_std_files();
+
        /* Get current thread state and interpreter pointer */
        tstate = PyThreadState_GET();
        interp = tstate->interp;
@@ -361,6 +390,9 @@ Py_Finalize(void)
        /* Destroy all modules */
        PyImport_Cleanup();
 
+       /* Flush stdout+stderr (again, in case more was printed) */
+       flush_std_files();
+
        /* Collect final garbage.  This disposes of cycles created by
         * new-style class definitions, for example.
         * XXX This is disabled because it caused too many problems.  If