call Cython function from C++

前端 未结 3 1367
终归单人心
终归单人心 2020-12-13 14:33

I have a C++ library that has a Python wrapper (written with SWIG). This library allows executing small user-defined code (a callback), such as element-wise operations on a

相关标签:
3条回答
  • 2020-12-13 15:11

    Embedding Python in Another Application may be useful reading.

    0 讨论(0)
  • 2020-12-13 15:16

    The trick with cython is in using the keyword public

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

    Then the command cythonize <your_file.pyx> along with <your_file.c> will create header <your_file.h> that you can include. Alternatively, you can create the header yourself:

    #ifdef __cplusplus {
    extern "C"
    #endif
    
    double cython_function( double value, double value2 );
    
    #ifdef __cplusplus
    }
    #endif
    

    Update:

    Then with a little overlay from Python you can use ctypes's callback mechanism

    func_type = CFUNCTYPE(c_double, c_double, c_double)
    
    your_library.set_callback_function ( func_type(user_modules.cython_function) )
    
    0 讨论(0)
  • 2020-12-13 15:21

    You can achieve that by doing pure cdef functions :

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

    Note: you can use "cython -a" to see that they are no python code involved for the content of run. So it will work with your c library.

    0 讨论(0)
提交回复
热议问题