如果这是非常基本的道歉,我对ctypes / python很新。
我的目标是调用一个C库来生成一个包含(动态分配)数组的对象,然后将该对象返回到python并将其保存在python数据结构中(对于此处的示例,一个对象)其中包括一小撮的整数)。这是我到目前为止所做的:
C-library相关代码:
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 doc:“numpy数组与ctypes对象共享内存。” - 在我的情况下,它包含一个指针,我不清楚该内存拥有/管理的位置。
我想我的问题是 - 是否有更好/更通用的方法来做到这一点?作为推论,如果没有ctypeslib.as_array的魔力,如果返回的对象包含动态分配的一些其他对象的数组,那么它将如何工作?目标是将其捕获到python列表?