QStringList PythonEngine::codeCompletionInterpreter(const QString& code) { runPythonHeader(); QString exp = QString("result_jedi_pythonlab = python_engine_get_completion_interpreter(\"%1\")"). arg(code); return codeCompletion(exp); }
ExpressionResult PythonEngine::runPythonExpression(const QString &expression, bool returnValue) { runPythonHeader(); QString exp; if (returnValue) exp = QString("result_pythonlab = %1").arg(expression); else exp = expression; PyObject *output = PyRun_String(exp.toLatin1().data(), Py_single_input, m_dict, m_dict); ExpressionResult expressionResult; if (output) { PyObject *type = NULL, *value = NULL, *traceback = NULL, *str = NULL; PyErr_Fetch(&type, &value, &traceback); if (type != NULL && (str = PyObject_Str(type)) != NULL && (PyString_Check(str))) { Py_INCREF(str); expressionResult.error = PyString_AsString(str); Py_XDECREF(type); Py_XDECREF(str); } else { // parse result if (returnValue) { PyObject *result = PyDict_GetItemString(m_dict, "result_pythonlab"); if (result) { Py_INCREF(result); PyArg_Parse(result, "d", &expressionResult.value); if (fabs(expressionResult.value) < EPS_ZERO) expressionResult.value = 0.0; Py_DECREF(result); } } } if (returnValue) PyRun_String("del result_pythonlab", Py_single_input, m_dict, m_dict); } else { ScriptResult error = parseError(); expressionResult.error = error.text; expressionResult.traceback = error.traceback; } Py_XDECREF(output); emit executedExpression(); return expressionResult; }
QStringList PythonEngine::codeCompletion(const QString& command) { QStringList out; runPythonHeader(); #pragma omp critical(completion) { PyObject *output = PyRun_String(command.toLatin1().data(), Py_single_input, m_dict, m_dict); // parse result if (output) { PyObject *result = PyDict_GetItemString(m_dict, "result_jedi_pythonlab"); if (result) { Py_INCREF(result); PyObject *list; if (PyArg_Parse(result, "O", &list)) { int count = PyList_Size(list); for (int i = 0; i < count; i++) { PyObject *item = PyList_GetItem(list, i); QString str = PyString_AsString(item); // remove builtin methods if (!str.startsWith("__")) { //qDebug() << str; out.append(str); } } } Py_DECREF(result); } PyObject *del = PyRun_String("del result_jedi_pythonlab", Py_single_input, m_dict, m_dict); Py_XDECREF(del); } else { PyErr_Clear(); } Py_XDECREF(output); } return out; }
QStringList PythonEngine::codeCompletionScript(const QString& code, int row, int column, const QString& fileName) { runPythonHeader(); QString fn = ""; if (QFile::exists(fileName)) fn = fileName; QString exp = QString("result_jedi_pythonlab = python_engine_get_completion_script(\"\"\"%1\"\"\", %2, %3, \"%4\")"). arg(code). arg(row). arg(column). arg(fn); return codeCompletion(exp); }
ScriptResult PythonEngine::runPythonScript(const QString &script, const QString &fileName) { m_isRunning = true; m_stdOut = ""; QSettings settings; // enable user module deleter if (settings.value("PythonEngine/UserModuleDeleter", true).toBool()) deleteUserModules(); runPythonHeader(); PyObject *output = NULL; if (QFile::exists(fileName)) { QString str = QString("from os import chdir; chdir(u'" + QFileInfo(fileName).absolutePath() + "')"); PyRun_String(str.toStdString().c_str(), Py_single_input, m_dict, m_dict); } // compile PyObject *code = Py_CompileString(script.toStdString().c_str(), fileName.toStdString().c_str(), Py_file_input); // run if (code) output = PyEval_EvalCode((PyCodeObject *) code, m_dict, m_dict); ScriptResult scriptResult; if (output) { scriptResult.isError = false; scriptResult.text = m_stdOut.trimmed(); } else { scriptResult = parseError(); } Py_XDECREF(output); m_isRunning = false; emit executedScript(); return scriptResult; }
QStringList PythonEngine::codeCompletion(const QString& code, int offset, const QString& fileName) { runPythonHeader(); QStringList out; QString exp; if (QFile::exists(fileName)) { exp = QString("result_rope_pythonlab = python_engine_get_completion_file(\"%1\", %2)"). arg(fileName). arg(offset); } else { QString str = code; // if (str.lastIndexOf("=") != -1) // str = str.right(str.length() - str.lastIndexOf("=") - 1); for (int i = 33; i <= 126; i++) { // skip numbers and alphabet and dot if ((i >= 48 && i <= 57) || (i >= 65 && i <= 90) || (i >= 97 && i <= 122) || (i == 46)) continue; QChar c(i); // qDebug() << c << ", " << str.lastIndexOf(c) << ", " << str.length(); if (str.lastIndexOf(c) != -1) { str = str.right(str.length() - str.lastIndexOf(c) - 1); break; } } if (str.contains(".")) { QString search = str.left(str.lastIndexOf(".")); exp = QString("result_rope_pythonlab = python_engine_get_completion_string_dot(\"%1\")"). arg(search); } else exp = QString("result_rope_pythonlab = python_engine_get_completion_string(\"%1\", %2)"). arg(str.trimmed()). arg(str.trimmed().length()); } // QTime time; // time.start(); PyObject *output = PyRun_String(exp.toLatin1().data(), Py_single_input, m_dict, m_dict); // qDebug() << time.elapsed(); // parse result if (output) { PyObject *result = PyDict_GetItemString(m_dict, "result_rope_pythonlab"); if (result) { Py_INCREF(result); PyObject *list; if (PyArg_Parse(result, "O", &list)) { int count = PyList_Size(list); for (int i = 0; i < count; i++) { PyObject *item = PyList_GetItem(list, i); QString str = PyString_AsString(item); // remove builtin methods if (!str.startsWith("__")) out.append(str); } } Py_DECREF(result); } PyRun_String("del result_rope_pythonlab", Py_single_input, m_dict, m_dict); } else { PyErr_Clear(); } return out; }
bool PythonEngine::runExpression(const QString &expression, double *value, const QString &command) { bool successfulRun = false; PyObject *output = NULL; runPythonHeader(); if (value) { // return value QString exp; if (command.isEmpty()) exp = QString("result_pythonlab = %1").arg(expression); else exp = QString("%1; result_pythonlab = %2").arg(command).arg(expression); #pragma omp critical(expression) { output = PyRun_String(exp.toLatin1().data(), Py_single_input, m_dict, m_dict); } if (output) { // parse result PyObject *result = PyDict_GetItemString(m_dict, "result_pythonlab"); if (result) { if ((QString(result->ob_type->tp_name) == "bool") || (QString(result->ob_type->tp_name) == "int") || (QString(result->ob_type->tp_name) == "float")) { Py_INCREF(result); PyArg_Parse(result, "d", value); if (fabs(*value) < EPS_ZERO) *value = 0.0; Py_XDECREF(result); successfulRun = true; } else { qDebug() << tr("Type '%1' is not supported.").arg(result->ob_type->tp_name).arg(expression); successfulRun = false; } } // speed up? // PyRun_String("del result_pythonlab", Py_single_input, m_dict, m_dict); } } else { #pragma omp critical(expression) { output = PyRun_String(expression.toLatin1().data(), Py_single_input, m_dict, m_dict); } if (output) successfulRun = true; } if (!output) { // error traceback Py_XDECREF(errorType); Py_XDECREF(errorValue); Py_XDECREF(errorTraceback); PyErr_Fetch(&errorType, &errorValue, &errorTraceback); if (errorTraceback) successfulRun = false; } Py_XDECREF(output); return successfulRun; }
bool PythonEngine::runScript(const QString &script, const QString &fileName, bool useProfiler) { m_isScriptRunning = true; PyGILState_STATE gstate = PyGILState_Ensure(); emit startedScript(); bool successfulRun = false; QSettings settings; // enable user module deleter if (settings.value("PythonEngine/UserModuleDeleter", true).toBool()) deleteUserModules(); runPythonHeader(); PyObject *output = NULL; if (QFile::exists(fileName)) { QString str = QString("from os import chdir; chdir(u'" + QFileInfo(fileName).absolutePath() + "')"); #pragma omp critical(import) { PyObject *import = PyRun_String(str.toLatin1().data(), Py_single_input, m_dict, m_dict); Py_XDECREF(import); } } // compile PyObject *code = Py_CompileString(script.toLatin1().data(), fileName.toLatin1().data(), Py_file_input); // run if (useProfiler) { setProfilerFileName(fileName); startProfiler(); } if (code) output = PyEval_EvalCode((PyCodeObject *) code, m_dict, m_dict); if (useProfiler) finishProfiler(); if (output) { successfulRun = true; Py_XDECREF(output); } else { // error traceback Py_XDECREF(errorType); Py_XDECREF(errorValue); Py_XDECREF(errorTraceback); PyErr_Fetch(&errorType, &errorValue, &errorTraceback); if (errorTraceback) successfulRun = false; } Py_XDECREF(code); m_isScriptRunning = false; // release the thread, no Python API allowed beyond this point PyGILState_Release(gstate); emit executedScript(); return successfulRun; }