我有一个 C 库,它与 CFFI 接口,定义如下:
import cffi
ffi = cffi.FFI()
ffi.cdef("""
typedef struct zkdtree zkdtree;
typedef struct zkdtree_result zkdtree_result;
zkdtree * zkdtree_load(const char * filename, char ** errout);
void zkdtree_delete(zkdtree *);
size_t zkdtree_nfeatures(zkdtree *);
double zkdtree_interpolate(zkdtree *, double * pt);
zkdtree_result * zkdtree_result_allocate(void);
void zkdtree_result_delete(zkdtree_result *);
void zkdtree_point_info(zkdtree *, double * pt, zkdtree_result * output);
bool zkdtree_result_interpolable(zkdtree_result *);
double zkdtree_result_central_value(zkdtree_result *);
double zkdtree_result_variance(zkdtree_result *);
""")
zkdtree
请注意,从未引用过类似事物的内部结构。
目前我正在加载一个包含相应符号的动态库:
C = ffi.dlopen("libcapi.so")
我希望能够在 numba jitted 函数(在 nopython 模式下)中调用这些函数并交易各种匿名结构(如 zkdtree)。我看过这个模块numba.cffi_support
,但似乎不知道如何教它理解我的定义。
我尝试过各种变化,但均未成功
tree_load = C.zkdtree_load
err = ffi.new('char **')
interp = C.zkdtree_interpolate
cffi_support.register_type(ffi.typeof(tree), numba.void)
@numba.njit
def test_one_point():
tree = tree_load(b"nlo.tree", err)
interp(tree, [0.,0.,0.,0.])
但我无法让它同时tree
与 和一起使用err
。我收到类似的错误
TypeError: Failed in nopython mode pipeline (step: nopython frontend)
<ctype 'zkdtree'>