通过 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)
.
我有一个 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)
.