受到另一个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')

10-06 01:44