通过 cffi 在 python 中使用 int * (array) return 值?

using an int * (array) return value in python via cffi?

我有一个 C 函数

int * myfunc()
{
   int * ret = (int *) malloc(sizeof(int)*5);
   ...
   return ret;
}

在python中我可以称它为

ret = lib.myfunc()

但我似乎无法弄清楚如何在 python 代码中实际使用 ret(即将其转换为长度为 5 的 int 数组。

我看到很多关于如何将 python 数组传递给 C 函数的文档(以及这里的问题),但没有看到如何处理从 C 函数返回的数组。

到目前为止我唯一想出的东西(哪种有效,但看起来很丑)

buf = ffi.buffer(ret,ffi.sizeof("int")*5)
int_array = ffi.from_buffer("int *", buf)

这是我应该做的吗?或者有更好的方法吗?

在 C 中,类型 int * 和类型 int[5] 在运行时是等价的。这意味着虽然您通过调用函数获得了 int *,但您可以直接使用它,就好像它是 int[5] 一样。除了 len() 之外,所有相同的操作都有效。例如:

ret = lib.myfunc()
my_python_list = [ret[i] for i in range(5)]
lib.free(ret)    # see below

作为调用malloc()的函数,你可能需要自己调用free(),否则会发生内存泄漏。通过在前面的 cdef() 中添加行 void free(void *); 来声明它。

这里有一些更高级的函数,它们的用法是可选的:您可以使用 p = ffi.cast("int[5]", p) 将类型从 int * 转换为 int[5];或者您可以将 C 数组转换为 Python 列表,使用等效但速度稍快的调用 my_python_list = ffi.unpack(ret, 5).