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',這很奇怪。這讓我陷入了一個循環。 –