Cython:如何在struct中公开void *和函数指针?

时间:2014-02-19 09:30:17

标签: python pointers function-pointers cython

我有一个C标题:

typedef struct
{    
      <normal members>
      void (*cb_func)(glp_tree *T, void *info);
      void *cb_info;
      <normal members>
} glp_iocp;

目前,在我的pxd文件中:

ctypedef struct IntOptCP "glp_iocp":
    <normal members>
    int out_dly     #  mip.out_dly (milliseconds)
    #void (*cb_func)(Tree* tree, void* info)
                    #  mip.cb_func
    #void* cb_info   #  mip.cb_info
    <normal members>

在pyx文件中,在某些时候,我(基本上)这样做:

cdef class MyClass:

    IntOptCP _iocp

    <__cintit__ and the like>

    def some_method(self):
        <manipulation of self._iocp>
        controls = dict()
        controls = self._iocp
        return controls

这很好用。但是,现在我还希望公开cb_funccb_info。然后,这将分配给控件。我想要的是两个python对象类型(类?),一个用于cb_func,一个用于cb_info,其实例可以传递给cb_func和{{1} } cb_info struct的参数。

我已阅读https://github.com/cython/cython/tree/master/Demos/callback(并使用了pycapsule),但是,我对Cython太缺乏经验/不熟悉,看看我如何能够将这些信息用于我的具体案例。

因此,欢迎任何关于如何(最佳)公开glp_iocpcb_func的帮助和指示。

1 个答案:

答案 0 :(得分:2)

您似乎可以公开cb_funccb_info做类似于这个玩具示例的事情:

import numpy as np
cimport numpy as np

ctypedef void (*f_type)(int, double*, double*)

ctypedef struct IntOptCP:
    int a
    double *b
    double *c
    f_type f

cdef class MyClass:
    cdef IntOptCP _iocp
    def exec_f(self):
        self._iocp.f(self._iocp.a, self._iocp.b, self._iocp.c)

cdef void myfunc(int a, double *b, double *c):
    cdef int i
    for i in range(a):
        b[i] += 1
        c[i] += 1

def main():
    cdef f_type f
    cdef np.ndarray[np.float64_t, ndim=1] b, c
    cdef int a
    a = 100
    b = np.zeros(a, dtype=np.float64)
    c = np.zeros(a, dtype=np.float64)
    test = MyClass()
    test._iocp.a = a
    test._iocp.b = &b[0]
    test._iocp.c = &c[0]
    test._iocp.f = myfunc
    print 'before', a, b, c
    test.exec_f()
    print 'after', a, b, c