我正在一个项目中,我必须将用户输入的C ++字符串变量转换为python可执行代码,我使用的是Python C API,因此我必须经历将C ++字符串转换为C字符串的中介工作(或字符数组)。一旦到达该位置,运行代码后就无法获得要打印的值。我正在搜索Python C API中的适当功能。到目前为止,我已经尝试过PyString_AsString(),
PyBytes_AsString(),
和PyObject_AsUTF8String
。当我尝试使用下面的代码运行这些函数时,每个函数都会导致内存问题。我必须用这三个来重新启动系统。
Py_Initialize();
//the expected output, the player's output, and the compare functions
//PyObject* expectAnswer; //the expected answer for the level
PyObject* main = PyImport_AddModule("_main_");
PyObject* globalDictionary = PyModule_GetDict(main);
PyObject* localDictionary = PyDict_New();
PyObject* result = PyRun_String(cPlayerString, Py_file_input, globalDictionary, localDictionary);
Py_Finalize();
我想知道我是否只在使用正确的电话。 const char* PyUnicode_AsData()
看起来很有希望,但是我仍然不知道是否需要先将已有的内容转换为Unicode。
感谢所有帮助!
您缺少所有错误检查。几乎每个Python C API调用都有一个返回值,该值指示是否发生错误,通常是NULL
指针。您必须检查这些并处理错误(如果已发生)。出于简洁的问题,我会以慈善为前提,假设您将其省略。
__main__
;双下划线。
可能是您真正的问题:read the documentation about the start tokens。 Py_file_input
将字符串视为Python文件(即任意长的语句集合)进行评估。 Python文件不会“返回”任何东西,因此result
可能是None
对象-您可以随时对其进行检查以确认这一点。您的选择是:
以使用仅处理单个表达式并返回结果的令牌Py_eval_input
。
使用语句集合(Py_file_input
)会更改本地词典这一事实-分配给该变量的任何变量随后都将在词典中可用,您可以访问它们。
您最终得到的对象可能不是字符串,因此在其上调用字符串函数可能会使它崩溃(Py*_Check
函数用于确认类型并避免这种崩溃)。您可能想在第一个实例中使用generic PyObject functions。 PyObject_Print/Str/Repr
可能就是您想要的。