编程语言
首页 > 编程语言> > 在Python 3.5中使用PyEval_EvalCode

在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