我正试图围绕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库
我想你知道this?因此,知道您可以加载主函数,让我们采用另一种方法。我编写了几个愚蠢的函数来测试这一点:
然后是接受回调的函数
可以直接从Python传递:
现在,让我们包装一个Python函数:
相关问题 更多 >
编程相关推荐