我正试图编写一个Cython包装器,以从Python接口C代码。
C库利用了Suitesparse的CHOLMOD,因此我认为安装scikit-sparse
(使用包含我需要的一切的cholmod.pyx
)是一种好方法。
但是,我没有找到包含CHOLMOD的这些定义的解决方案,并且我想避免用我需要的结构的typedef编写“我自己的” cholmod.pxd
。
作为一个最小的示例,假设我有一个foo.h
头文件,该文件定义了一个结构,该结构又包含一些CHOLMOD结构以及一些虚函数。我的Cython定义文件如下所示:
cdef extern from "foo.h":
ctypedef struct foostruct:
cholmod_common c
cholmod_factor *f
cholmod_dense *d
void initialize_foostruct(foostruct* bar)
void modify_foostruct(foostruct* bar)
实施可以例如是:
from libc.stdlib cimport calloc, malloc, free
from foo cimport *
cdef class Foo:
cdef foostruct* _bar
def __cinit__(self):
self._bar = <foostruct*> calloc(1, sizeof(foostruct))
if self._bar is NULL:
raise MemoryError()
initialize_foostruct(self._bar)
def __dealloc__(self):
if self._bar is not NULL:
free(self._bar)
self._bar = NULL
def do_something(self):
modify_foostruct(self._bar)
显然,这将失败,因为定义文件中未知cholmod_common
等(错误读取'cholmod_common' is not a type identifier
)。我尝试了类似from sksparse.cholmod cimport *
之类的方法,但无济于事...
是否可以以某种方式(从scikit-sparse
或其他来源)导入那些类型标识符以按照我的定义文件中所述的方式使用它们?