C++调用Cython函数

2024-04-23 22:05:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C++库,它有一个Python包装器(用SWIG编写)。这个库允许执行用户定义的小代码(回调),比如对向量执行元素操作。一、 你可以做任意的二进制函数,而不仅仅是a+。现在,这是通过接受二进制函数的可调用Python对象并调用它来实现的。它可以工作,但是比不必在每次迭代中上下跳转到Python的代码慢80倍。

我如何编写/构建/导入Cython函数,可以传递到C++库中,以便直接由C++库调用?

编辑: 如果我坚持C,我会写一些

EWise(double (*callback)(double, double))

尤斯会callback(10, 20);或诸如此类。我希望用{ Cd2}}写在Cython中,使用用户想要的任何名称,并且指针必须通过Python以某种方式传递给我的C++库。不知怎的我不清楚。


Tags: 对象函数代码用户元素编辑定义callback
3条回答

您可以通过执行纯^{}函数来实现这一点:

# declare the prototype of your function
ctypedef void (*callback_ptr)(int arg)

# declare your function as cdef
cdef void my_callback(int arg):
    print 'doing some python here', arg

# now, you can use the cdef func as a callback
# in pure C !
cdef void run():
    cdef callback_ptr p = my_callback
    p(42)

if __name__ == '__main__':
    run()

注意:您可以使用“cython-a”来查看它们与run的内容无关。所以它会和你的c库一起工作。

cython的诀窍在于使用关键字public

cdef public double cython_function( double value, double value2 ):
    return value + value2

然后命令cythonize <your_file.pyx><your_file.c>将创建可以包含的头<your_file.h>。 或者,您可以自己创建标题:

#ifdef __cplusplus {
extern "C"
#endif

double cython_function( double value, double value2 );

#ifdef __cplusplus
}
#endif

更新

然后使用Python中的一点覆盖,就可以使用ctypes's callback mechanism

func_type = CFUNCTYPE(c_double, c_double, c_double)

your_library.set_callback_function ( func_type(user_modules.cython_function) )

相关问题 更多 >