我正在使用C库并将其与python接口,而不需要太多细节,我的库有一个C函数,我们将调用'foo'返回void const *(它返回float const *或double const *取决于应用程序)。在python中,我将其声明为:
from ctypes import *
mylib = cdll.LoadLibrary('mylib.so')
foo = mylib.foo
foo.restype = c_void_p
从现在开始,我们将假设我们使用float而不是double并将指针的预期尺寸指定为'D',例如12
D = 12
我正在尝试将返回值的深层副本复制到python numpy数组中,这样我就不必担心被释放的C库分配的内存,我尝试按如下方式实现它:
import numpy as np
x = np.frombuffer(foo(), np.float32, D * np.dtype(np.float32).itemsize).copy()
AttributeError: 'int' object has no attribute '__buffer__'
但它似乎不起作用,我认为'foo'的返回类型将是ctypes c_void_p类型的python对象,但实际上它只是一个int。我猜测int的值对应于数组中第一个float的内存中的地址,但也许我错了。必须有一个简单的方法来做这个,有人有任何建议吗?
如果您想了解更多详情(关于图书馆等),请告诉我,我试图让问题变得简单。
感谢。
答案 0 :(得分:2)
感谢eryksun的评论:
x = np.frombuffer((c_float * D).from_address(foo()), np.float32).copy()