Я пытаюсь написать оболочку Cython для интерфейса с кодом C из Python.
Библиотека C использует CHOLMOD от Suitesparse, поэтому я решил установить scikit-sparse
(который использует cholmod.pyx
, который содержитвсе что мне нужно) было бы аккуратно. Тем не менее, я безуспешно искал решения для включения этих определений CHOLMOD, и я хотел бы избежать написания «своих» cholmod.pxd
с typedefs структур, которые мне нужны.
В качестве минимального примера, скажем, яиметь заголовочный файл 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
или из другого источника) для использованияих так, как описано в моем файле определения?