Пример #1
0
QStringList PythonEngine::codeCompletionInterpreter(const QString& code)
{
    runPythonHeader();

    QString exp = QString("result_jedi_pythonlab = python_engine_get_completion_interpreter(\"%1\")").
            arg(code);

    return codeCompletion(exp);
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}
Пример #8
0
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;
}