diff --git a/libnymea-core/integrations/pythonintegrationplugin.cpp b/libnymea-core/integrations/pythonintegrationplugin.cpp index ee3b334f..3d872dcb 100644 --- a/libnymea-core/integrations/pythonintegrationplugin.cpp +++ b/libnymea-core/integrations/pythonintegrationplugin.cpp @@ -238,6 +238,9 @@ PythonIntegrationPlugin::~PythonIntegrationPlugin() s_plugins.take(this); Py_XDECREF(m_pluginModule); Py_DECREF(m_nymeaModule); + Py_XDECREF(m_logger); + Py_XDECREF(m_stdOutHandler); + Py_XDECREF(m_stdErrHandler); Py_EndInterpreter(m_threadState); @@ -357,23 +360,24 @@ bool PythonIntegrationPlugin::loadScript(const QString &scriptFile) QString category = metadata.pluginName(); category.replace(0, 1, category[0].toUpper()); PyObject *args = Py_BuildValue("(s)", category.toUtf8().data()); - PyNymeaLoggingHandler *logger = reinterpret_cast(PyObject_CallObject((PyObject*)&PyNymeaLoggingHandlerType, args)); + m_logger = PyObject_CallObject((PyObject*)&PyNymeaLoggingHandlerType, args); Py_DECREF(args); // Override stdout and stderr args = Py_BuildValue("(si)", category.toUtf8().data(), QtMsgType::QtDebugMsg); - PyStdOutHandler*stdOutHandler = reinterpret_cast(PyObject_CallObject((PyObject*)&PyStdOutHandlerType, args)); + m_stdOutHandler = PyObject_CallObject((PyObject*)&PyStdOutHandlerType, args); Py_DECREF(args); - PySys_SetObject("stdout", (PyObject*)stdOutHandler); + PySys_SetObject("stdout", m_stdOutHandler); args = Py_BuildValue("(si)", category.toUtf8().data(), QtMsgType::QtWarningMsg); - PyStdOutHandler*stdErrHandler = reinterpret_cast(PyObject_CallObject((PyObject*)&PyStdOutHandlerType, args)); - PySys_SetObject("stderr", (PyObject*)stdErrHandler); + m_stdErrHandler = PyObject_CallObject((PyObject*)&PyStdOutHandlerType, args); + PySys_SetObject("stderr", m_stdErrHandler); Py_DECREF(args); - int loggerAdded = PyModule_AddObject(m_pluginModule, "logger", reinterpret_cast(logger)); + int loggerAdded = PyModule_AddObject(m_pluginModule, "logger", m_logger); if (loggerAdded != 0) { qCWarning(dcPythonIntegrations()) << "Failed to add the logger object"; - Py_DECREF(logger); + Py_DECREF(m_logger); + m_logger = nullptr; } // Export metadata ids into module diff --git a/libnymea-core/integrations/pythonintegrationplugin.h b/libnymea-core/integrations/pythonintegrationplugin.h index d57c1305..46dfd4c6 100644 --- a/libnymea-core/integrations/pythonintegrationplugin.h +++ b/libnymea-core/integrations/pythonintegrationplugin.h @@ -77,6 +77,9 @@ private: PyObject *m_nymeaModule = nullptr; // The imported plugin module (the plugin.py) PyObject *m_pluginModule = nullptr; + PyObject *m_logger = nullptr; + PyObject *m_stdOutHandler = nullptr; + PyObject *m_stdErrHandler = nullptr; // A map of plugin instances to plugin python scripts/modules // Make sure to hold the GIL when accessing this.