1

我试图将扩展模块从2.7移植到3.5。扩展模块使用PyEval_EvalCode。它用一些代码类似于以下代码:在Python 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接受 a PyObject*。我需要做些什么来将其转换为PyObject,我可以传递给PyEval_EvalCode

回答

3

对于绝大多数Python类型,PyObject是该类型的“父”结构。尝试投射参数:(PyObject*)compiled_code

Code Objects文档明确指出PyObject*可以PyCodeObject*(否则PyCode_Check将不存在),因此,如果你知道这是一个代码对象,中投是安全的。

+0

谢谢,他们决定像所有其他方法一样,让'PyNode_Compile'返回一个'PyCodeObject'而不是'PyObject',这很奇怪。这让我陷入了一个循环。 –