如何将PyObjects转换为C数据类型?

问题描述 投票:0回答:1

我正在一个项目中,我必须将用户输入的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。

感谢所有帮助!

c++ python-c-api
1个回答
1
投票
  1. 您缺少所有错误检查。几乎每个Python C API调用都有一个返回值,该值指示是否发生错误,通常是NULL指针。您必须检查这些并处理错误(如果已发生)。出于简洁的问题,我会以慈善为前提,假设您将其省略。

  2. __main__;双下划线。

  3. 可能是您真正的问题:read the documentation about the start tokensPy_file_input将字符串视为Python文件(即任意长的语句集合)进行评估。 Python文件不会“返回”任何东西,因此result可能是None对象-您可以随时对其进行检查以确认这一点。您的选择是:

    • 以使用仅处理单个表达式并返回结果的令牌Py_eval_input

    • 使用语句集合(Py_file_input)会更改本地词典这一事实-分配给该变量的任何变量随后都将在词典中可用,您可以访问它们。

  4. 您最终得到的对象可能不是字符串,因此在其上调用字符串函数可能会使它崩溃(Py*_Check函数用于确认类型并避免这种崩溃)。您可能想在第一个实例中使用generic PyObject functionsPyObject_Print/Str/Repr可能就是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.