在Python 3.5中使用PyEval_EvalCode
作者:互联网
我正在尝试将扩展模块从2.7移植到3.5.扩展模块使用PyEval_EvalCode.它使用类似于以下代码的代码来做到这一点:
struct _node *compiled_node = PyParser_SimpleParseString (in_string, Py_file_input);
if (compiled_node)
{
PyCodeObject *compiled_code = PyNode_Compile (compiled_node, "temp.py");
if (compiled_code)
{
return_value.Reset(PyEval_EvalCode (compiled_code, globals.get(), locals.get()));
}
}
在Python 2.7中可以正常工作.在Python 3.5中,编译失败,因为PyNode_Compile返回了PyCodeObject,但是在Python 3.5中,PyEval_EvalCode接受了PyObject *.我需要怎么做才能将其转换为可以传递给PyEval_EvalCode的PyObject?
解决方法:
对于绝大多数Python类型,PyObject是该类型的“父”结构.尝试强制转换参数:(PyObject *)compiled_code.
Code Objects文档清楚地表明PyObject *可以是PyCodeObject *(否则PyCode_Check将不存在),因此,如果您知道它是一个代码对象,则强制转换是安全的.
标签:python-3-x,python-2-7,python-c-extension,python-c-api,python 来源: https://codeday.me/bug/20191027/1947448.html