抱歉,如果这很基本,我对 ctypes/python 还很陌生。
我的目标是调用一个 C 库,生成一个包含(动态分配的)数组的对象,然后将该对象返回给 python 并将其保存在 python 数据结构中(例如,一个包含numpy 整数数组)。这是我到目前为止所拥有的:
C库相关代码:
struct footype{
int p1;
int *myarr;
}
footype myfun(int nx, ny, nz){
static footype myfoo;
myfoo.myarr = new int[nx*ny*nz];
myfoo.p1 = nx+ny;
return myfoo;
}
以及相关的python代码:
import numpy as np
from ctypes import *
class Foopy(Structure):
_fields_ = [("p1",c_int),("mat",POINTER(c_int))]
lib = cdll.LoadLibrary("./libmyfun.so")
lib.myfun.restype = Foo
myfoo = lib.myfun(10,10,10)
myobj.arr = np.ctypeslib.as_array(myfoo.mat,(10,10,10))
myobj.p1 = myfoo.p1
这名义上是有效的myobj
有预期的内容。但我想知道这是否是在自找麻烦,因为来自 numpy.ctypeslib.as_array 文档:“numpy 数组与 ctypes 对象共享内存。” - 在我的例子中包含一个指针,我不清楚该内存在哪里拥有/管理。
我想我的问题是 - 有没有更好/更通用的方法来做到这一点?作为推论,如果返回的对象包含一些其他对象的动态分配数组,并且目标是将其捕获到 python 列表中,那么如果没有 ctypeslib.as_array 的魔力,这将如何工作?