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

How to convert PyObjects to C data types?

本文关键字:数据类型 转换 PyObjects      更新时间:2023-10-16

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

谢谢你的帮助!

  1. 您错过了所有的错误检查。几乎每个Python C API调用都有一个返回值,指示是否发生了错误,通常是NULL指针。您必须检查这些并在发生错误时进行处理。我善意地假设你为了一个简洁的问题而省略了这个。

  2. __main__;双下划线。

  3. 可能是您真正的问题:阅读有关启动令牌的文档。Py_file_input对字符串求值,就好像它是一个Python文件(即任意长的语句集合(。Python文件不会"返回"任何内容,因此result可能是None对象——您可以随时检查它来确认这一点。您的选择是:

    • 使用令牌Py_eval_input,该令牌仅处理单个表达式并返回结果。

    • 使用这样一个事实,即语句集合(Py_file_input(将更改本地字典-分配给的任何变量之后都将在字典中可用,并且您可以访问这些变量。

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