Skip to content

Commit 3d3943f

Browse files
committed
[commontk] Add support for enabling stdout/stderr redirection
1 parent ddecb44 commit 3d3943f

File tree

2 files changed

+64
-12
lines changed

2 files changed

+64
-12
lines changed

src/PythonQt.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
19071947
QString PythonQt::getReturnTypeOfWrappedMethod(PyObject* module, const QString& name)
19081948
{
19091949
QStringList tmp = name.split(".");

src/PythonQt.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,18 @@ class PYTHONQT_EXPORT PythonQt : public QObject {
268268

269269
//@}
270270

271+
//---------------------------------------------------------------------------
272+
//! \name Standard output handling
273+
//@{
274+
275+
//! return \a true if std out/err redirection is enabled.
276+
bool redirectStdOutCallbackEnabled() const;
277+
278+
//! enable or disable std out/err redirection to pythonStdOut() and pythonStdErr() signals.
279+
void setRedirectStdOutCallbackEnabled(bool enabled);
280+
281+
//@}
282+
271283
//---------------------------------------------------------------------------
272284
//! \name Modules
273285
//@{

0 commit comments

Comments
 (0)