如何将 PyObjects 转换为 C 数据类型?
How to convert PyObjects to C data types?
我正在做一个项目,我必须将用户输入的 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 调用都有一个 return 值指示是否发生错误,通常是一个 NULL
指针。您必须检查这些并在错误发生时处理错误。为了一个简洁的问题,我会慷慨地假设你省略了这个。
__main__
;双下划线.
可能是您真正的问题:read the documentation about the start tokens。 Py_file_input
评估字符串,就好像它是一个 Python 文件(即任意长的语句集合)。 Python 文件没有 "return" 任何东西,因此 result
可能是一个 None
对象 - 您可以随时检查它以确认这一点。您的选择是:
使用令牌 Py_eval_input
,它仅处理单个表达式并执行 return 结果。
使用语句集合 (Py_file_input
) 将更改本地字典的事实 - 分配给的任何变量之后都将在字典中可用,您可以访问它们。
你最终得到的对象(可能)不会是一个字符串,所以在它上面调用字符串函数可能会使它崩溃(Py*_Check
函数用于确认类型并避免这种崩溃)。您可能希望首先使用 generic PyObject functions。 PyObject_Print/Str/Repr
可能就是您想要的。
我正在做一个项目,我必须将用户输入的 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 调用都有一个 return 值指示是否发生错误,通常是一个
NULL
指针。您必须检查这些并在错误发生时处理错误。为了一个简洁的问题,我会慷慨地假设你省略了这个。__main__
;双下划线.可能是您真正的问题:read the documentation about the start tokens。
Py_file_input
评估字符串,就好像它是一个 Python 文件(即任意长的语句集合)。 Python 文件没有 "return" 任何东西,因此result
可能是一个None
对象 - 您可以随时检查它以确认这一点。您的选择是:使用令牌
Py_eval_input
,它仅处理单个表达式并执行 return 结果。使用语句集合 (
Py_file_input
) 将更改本地字典的事实 - 分配给的任何变量之后都将在字典中可用,您可以访问它们。
你最终得到的对象(可能)不会是一个字符串,所以在它上面调用字符串函数可能会使它崩溃(
Py*_Check
函数用于确认类型并避免这种崩溃)。您可能希望首先使用 generic PyObject functions。PyObject_Print/Str/Repr
可能就是您想要的。