我正在构建一个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)的尝试的最佳方法是什么?