Я пытаюсь написать оболочку для программы на C, чтобы я мог вызывать ее из Python.Я использую Cython для этого.Функция C принимает функцию обратного вызова в качестве аргумента, но эта функция обратного вызова будет известна только во время выполнения программы python.Я искал, как это сделать, и кажется, что это не простое решение, но, кажется, работает следующее:
#python.py
libc = cdll.LoadLibrary("myfunc.so") #Callback function is defined in myfunc.so
....
c_wrapper(libc.fun, ...)
.
#c_wrapper.pyx
cdef extern void mainfunction(void *F, ...) #The intial C function we are wrapping
ctypedef void (*myfuncptr) ()
def c_wrapper(f, ...) # our function pointer is passed to the wrapper as a Python object
cdef myfuncptr thisfunc
thisfunc = (<myfuncptr*><size_t>addressof(f))[0]
mainfunction(thisfunc, ...)
Этот метод работает для функций C и FORTRAN(я предполагаю, что это будет работать для большинства скомпилированных языков) и функций Python (с использованием типов C), но это кажется немного неловким.Есть ли более простой способ сделать это в Cython?
Спасибо
РЕДАКТИРОВАТЬ: я не могу изменить библиотеку C я пытаюсь обернуть