@@ -1867,18 +1867,22 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
18671867 PythonQtObjectPtr sys;
18681868 sys.setNewRef (PyImport_ImportModule (" sys" ));
18691869
1870- if (redirectStdOut) {
1871- PythonQtObjectPtr out;
1872- PythonQtObjectPtr err;
1873- // create a redirection object for stdout and stderr
1874- out = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1875- ((PythonQtStdOutRedirect*)out.object ())->_cb = stdOutRedirectCB;
1876- err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1877- ((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
1878- // replace the built in file objects with our own objects
1879- PyModule_AddObject (sys, " stdout" , out);
1880- PyModule_AddObject (sys, " stderr" , err);
1881- }
1870+ // Backup original 'sys.stdout' and 'sys.stderr'
1871+ PyModule_AddObject (sys, " pythonqt_original_stdout" , PyObject_GetAttrString (sys, " stdout" ));
1872+ PyModule_AddObject (sys, " pythonqt_original_stderr" , PyObject_GetAttrString (sys, " stderr" ));
1873+
1874+ // Create a redirection object for stdout and stderr
1875+ PythonQtObjectPtr out;
1876+ PythonQtObjectPtr err;
1877+ out = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,NULL , NULL );
1878+ ((PythonQtStdOutRedirect*)out.object ())->_cb = stdOutRedirectCB;
1879+ err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,NULL , NULL );
1880+ ((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
1881+ // replace the built in file objects with our own objects
1882+ PyModule_AddObject (sys, " pythonqt_stdout" , out);
1883+ PyModule_AddObject (sys, " pythonqt_stderr" , err);
1884+
1885+ setRedirectStdOutCallbackEnabled (redirectStdOut);
18821886
18831887 // add PythonQt to the list of builtin module names
18841888 PyObject *old_module_names = PyObject_GetAttrString (sys.object ()," builtin_module_names" );
@@ -1904,6 +1908,42 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
19041908#endif
19051909}
19061910
1911+ bool PythonQt::redirectStdOutCallbackEnabled () const
1912+ {
1913+ PythonQtObjectPtr sys;
1914+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1915+
1916+ PythonQtObjectPtr pythonqt_stdout;
1917+ pythonqt_stdout.setNewRef (PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1918+
1919+ PythonQtObjectPtr stdout;
1920+ stdout.setNewRef (PyObject_GetAttrString (sys.object (), " stdout" ));
1921+
1922+ return PyObject_RichCompareBool (pythonqt_stdout.object (), stdout.object (), Py_EQ);
1923+ }
1924+
1925+ void PythonQt::setRedirectStdOutCallbackEnabled (bool enabled)
1926+ {
1927+ PythonQtObjectPtr sys;
1928+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1929+
1930+ if (enabled) {
1931+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stdout" ) ) {
1932+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1933+ }
1934+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stderr" ) ) {
1935+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_stderr" ));
1936+ }
1937+ } else {
1938+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stdout" ) ) {
1939+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stdout" ));
1940+ }
1941+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stderr" ) ) {
1942+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stderr" ));
1943+ }
1944+ }
1945+ }
1946+
19071947QString PythonQt::getReturnTypeOfWrappedMethod (PyObject* module , const QString& name)
19081948{
19091949 QStringList tmp = name.split (" ." );
0 commit comments