从C ++调用Cython函数

时间:2011-04-19 00:57:06

标签: c++ python callback cython

我有一个带有Python包装器的C ++库(用SWIG编写)。该库允许执行小的用户定义代码(回调),例如向量上的元素操作。即而不只是一个+你可以做任意二进制函数。现在,这是通过接受二进制函数的可调用Python对象并调用它来实现的。它可以工作,但是比每次迭代都不需要在Python中反弹的代码慢大约80倍。

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

修改 如果我只是坚持C,那么我会写一些类似

的东西
EWise(double (*callback)(double, double))
然后,EWise将callback(10, 20);或其他人。我希望用Cython编写callback,使用用户想要的任何名称,并且必须通过Python以某种方式将指针传递给我的C ++库。不知怎的,这是我不清楚的地方。

3 个答案:

答案 0 :(得分:15)

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) )

答案 1 :(得分:2)

您可以通过执行纯cdef函数来实现这一目标:

# 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”来查看它们不是运行内容所涉及的python代码。所以它适用于您的c库。

答案 2 :(得分:0)