eismultiplexer-qt/pythonembed.cpp

76 lines
2.1 KiB
C++

#include "pythonembed.h"
#include <Python.h>
#include <QDebug>
PythonEmbed::PythonEmbed(QTextEdit* outputWidget, QObject* parent)
: QObject(parent), m_outputWidget(outputWidget) {
// Initialize Python
Py_Initialize();
m_initialized = true;
// Initialize the output widget with Python prompt
m_outputWidget->clear();
m_outputWidget->append("Python 3.11.2 (main, Oct 5 2023, 17:20:59) [GCC 11.4.0] on linux\n");
m_outputWidget->append("Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\n");
m_outputWidget->append(">>> ");
}
PythonEmbed::~PythonEmbed() {
if (m_initialized) {
Py_Finalize();
}
}
void PythonEmbed::runScript(const QString& scriptContent) {
if (!m_initialized) {
m_outputWidget->append("Python not initialized\n");
return;
}
// Convert QString to const char*
QByteArray scriptBytes = scriptContent.toUtf8();
const char* script = scriptBytes.constData();
// Run the script
PyRun_SimpleString(script);
// Check for any errors
if (PyErr_Occurred()) {
handlePythonError("Script execution error");
} else {
m_outputWidget->append("\n>>> ");
}
}
void PythonEmbed::stopScript() {
// In this simple implementation, we don't have a running Python thread
// to stop, but we could add that functionality later
}
void PythonEmbed::handlePythonError(const char* context) {
PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);
if (type) {
PyObject *str = PyObject_Str(value);
PyObject *bytes = PyUnicode_AsEncodedString(str, "utf-8", "strict");
const char *error_msg = PyBytes_AS_STRING(bytes);
QString errorString = QString::fromUtf8(context) + ": " + QString::fromUtf8(error_msg);
m_outputWidget->append(errorString);
Py_DecRef(str);
Py_DecRef(bytes);
Py_DecRef(type);
Py_DecRef(value);
Py_DecRef(traceback);
} else {
m_outputWidget->append(QString::fromUtf8(context) + ": No error information available");
}
}
#include "pythonembed.moc"