如何与numba中的cffi void指针进行交互

时间:2019-02-18 12:09:10

标签: python numba cffi

我有一个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.])

但是我无法使其与treeerr一起使用。我收到类似

的错误
TypeError: Failed in nopython mode pipeline (step: nopython frontend)
<ctype 'zkdtree'>

0 个答案:

没有答案