受到另一个answer的启发,我有一个使用ctypeslib.ndpointer
调用的ctypes函数:
lib.foo.argtypes = [ctypeslib.ndpointer(np.complex64, ndim=1, flags='C'), POINTER(c_int)]
外部函数的声明如下:
void foo(cmplx_float *array, int *length)
我的问题是我想两次调用该函数。我第一次想将
nullptr
传递给array
参数,以便可以找到所需的长度。然后第二次,我将传入一个numpy数组。所以我是这样的:
lib.foo(None, length)
失败并显示以下错误:
我可以通过
nullptr
吗? 最佳答案
如果(像我一样)您要处理多种不同的数组类型,则更好的解决方法是包装ndpointer
本身:
import numpy as np
from numpy.ctypeslib import ndpointer
def wrapped_ndptr(*args, **kwargs):
base = ndpointer(*args, **kwargs)
def from_param(cls, obj):
if obj is None:
return obj
return base.from_param(obj)
return type(base.__name__, (base,), {'from_param': classmethod(from_param)})
ComplexArrayType = wrapped_ndptr(dtype=np.complex128, ndim=1, flags='C_CONTIGUOUS')
DoubleArrayType = wrapped_ndptr(dtype=np.float64, ndim=1, flags='C_CONTIGUOUS')