我想你是知道
这个?
答:是的,很容易。请遵循Cython来源分发中的Demos / callback /中的示例
因此,知道您可以卸载主要功能,让我们采取另一种方法。我写了几个愚蠢的函数来测试这一点:
/* lib.c -> lib.so */
#include <stdio.h>
void fn1(void) {
puts("Called function 1");
}
void fn2(void) {
puts("Called function 2");
}
然后,执行回调的函数
/* main.c -> main.so */
typedef void (*callback)();
void mainfunction(void *F) {
((callback)F)();
}
可以直接从Python传递:
>>> from ctypes import cdll
>>> lib = cdll.LoadLibrary('./lib.so')
>>> main = cdll.LoadLibrary('./main.so')
>>> main.mainfunction(lib.fn1)
Called function 1
>>> main.mainfunction(lib.fn2)
Called function 2
>>> from ctypes import CFUNCTYPE
>>> def pyfn():
... print "Called the Python function"
...
>>> CWRAPPER = CFUNCTYPE(None)
>>> wrapped_py_func = CWRAPPER(pyfn)
>>> main.mainfunction(wrapped_py_func)
Called the Python function