在C ++中中断嵌入式python执行的最佳方法

时间:2015-11-30 17:35:39

标签: python c++ python-2.7 extend

我正在构建一个C ++应用程序,它允许用户输入Python代码以直接与C ++环境中的对象进行交互。目前,我已经能够完成以下工作:

我在C ++中有一组嵌入式函数,可以作为模块导入Python并调用。

我从Python代码中获取每个嵌入式函数调用,并将它们添加到C ++中的“命令队列”列表变量中,然后可以对其进行迭代,以确认指令列表小于100长。但是,当我尝试这样做时,我似乎无法找到一种优雅的方法来避免整个应用程序崩溃。

PythonHandler.cpp:

List<String> pythonCommandQueue;

PyObject* self_Move(PyObject *self, PyObject *args)
{
    fprintf(stderr, "Number of instructions: %i\n", pythonCommandQueue.Size()+1);
    if (pythonCommandQueue.Size() > 100) {
        fprintf(stderr, "Number of instructions exceeds limit! Restarting...");
        PyErr_SetInterrupt();
        fprintf(stderr, "DONE!\n");
    } else {
        char* direction;
        // Get direction from Python parameters tuple
        if (!PyArg_ParseTuple(args, "s", &direction))
            return NULL;

        // Run function on actor from VPPO
        if (String(direction) == String("up")) {
            pythonCommandQueue.Push("up");
        }
        else if (String(direction) == String("down")) {
            pythonCommandQueue.Push("down");
        }
        else if (String(direction) == String("left")) {
            pythonCommandQueue.Push("left");
        }
        else if (String(direction) == String("right")) {
            pythonCommandQueue.Push("right");
        }
        else {
            return NULL;
        }
        return Py_BuildValue("Oi", Py_True);
    }
}

PyMethodDef SelfMethods[] = {
    {"move", self_Move, METH_VARARGS, "Move actor from VPPO."},
    {NULL, NULL, 0, NULL}
};

void PythonHandler::Start()
{
    Py_Initialize();
    Py_InitModule("self", SelfMethods);
}

int PythonHandler::RunPyScript()
{
    char* userScriptFilename = "run.py";
    PyObject* PyFileObject = PyFile_FromString(userScriptFilename, "r");

    if (PyFileObject != NULL) {
        PyRun_SimpleFileEx(PyFile_AsFile(PyFileObject), userScriptFilename, 1);
    }
    else {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", userScriptFilename);
        return 1;
    }
    return 0;
}

run.py:

import self
self.move("up")

在没有C ++环境崩溃的情况下,确保取消执行Python(PyRun_SimpleFileEx)的尝试的最佳方法是什么?

0 个答案:

没有答案