使用ctypes从C语言返回一个元组的元组给Python

4
我需要从我的C DLL返回一个异构数据的二维数组到Python。为此,我从我的C DLL返回了一个元组的元组。它被返回为PyObject *。在我的Python代码中,这个元组的元组需要被访问为tup[0][0]表示第一行第一列,tup[0][1]表示第一行第二列,以此类推。 我使用ctypes调用C函数来返回元组的元组。然而,在Python代码中,我无法访问返回的PyObject*。
extern "C" _declspec(dllexport) PyObject *FunctionThatReturnsTuple()
{   
    PyObject *data = GetTupleOfTuples();    

    return data;    //(PyObject*)pFPy_BuildValue("O", data);    
}

在Python脚本中,我使用以下代码 -
libc = PyDLL("MyCDLL.dll")

x = libc.FunctionThatReturnsTuple()

if x != None :
   print str( x[0][0] )
   print str( x[0][1] )

然而我遇到了一个错误——'int'对象不可引用。我认为这是因为 x 被作为指针接收。

应该如何正确实现这个功能呢?


你在 Stack Overflow 上提出了许多问题,但是你没有接受过任何答案,也没有点赞过。如果你能投票并接受有帮助的答案,人们会更愿意帮助你。 - Mark
抱歉!我应该做那件事。 - Abhaya
1个回答

11
您没有设置 "FunctionThatReturnsTuple" 的返回类型。
在C语言中:
#include <Python.h>

extern "C" PyObject* FunctionThatReturnsTuple()
{   
    PyObject* tupleOne = Py_BuildValue("(ii)",1,2);
    PyObject* tupleTwo = Py_BuildValue("(ii)",3,4);
    PyObject* data = Py_BuildValue("(OO)", tupleOne, tupleTwo);

    return data;
}

Python:

->

Python:

>>> from ctypes import *
>>> libc = PyDLL("./test.dll")
>>> func = libc.FunctionThatReturnsTuple
>>> func()
-1215728020
>>> func.restype = py_object
>>> func()
((1, 2), (3, 4))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接