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

2024-05-19 19:17:53 发布

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

我有一个C标题:

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

目前,在我的pxd文件中:

^{pr2}$

在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_func和{}。这将中断对控件的分配。我想要的是两种python对象类型(类?),一个用于cb_func,一个用于cb_info,其实例可以传递给glp_iocp结构的cb_func和{}参数。在

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

因此,欢迎提供关于如何(最好)公开cb_func和{}的任何帮助和建议。在


Tags: 文件selfinfotree标题cythonfunccb
1条回答
网友
1楼 · 发布于 2024-05-19 19:17:53

您似乎可以公开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

相关问题 更多 >