Cython中的cdef extern自定义类型

时间:2018-10-01 18:46:12

标签: python cython

我正在使用Cython将某些C功能与正在编写的Python应用程序接口。之前,我已经练习过使用Cython从Python调用C代码,下面的代码演示了我通常在.pyx文件中执行的操作的示例:

# wrapper.pyx

cdef extern from "customlib.h":
    int my_function(int value)

def call_c_code(value):
    output_value = engine(value)
    print(output_value)

...使用我的customlib.h文件:

#ifndef CUSTOM_HEADER_H
#define CUSTOM_HEADER_H

/* function */
int my_function(int value);

#endif

...然后调用相应的Python实现:

# caller.py

import wrapper

wrapper.call_c_code(5) # and then the result is printed... etc.

这很好用。但是,如果my_function是用户定义的类型,而不是intdouble等,该怎么办?我尝试与之交互的C代码定义了该结构

typedef struct 
{
    double *data;                 /* a 1D data array of type double */
    int nd;                       /* the number of dimensions */
    unsigned long *dimensions;    /* an array that contains the size of each dimension */
    unsigned long num_elem;       /* the number of elements in this array (cumprod(dimensions)) */
} dataArray_double;

,然后将dataArray_double定义为返回类型和某些输入类型的函数。

要使用此自定义类型的函数来构建Cython接口代码,我需要采取什么步骤?

1 个答案:

答案 0 :(得分:1)

您必须创建一个包含C变量的容器类。 C变量(数字和字符除外)不能在Python级别按原样传递。如果您要在此处使用标准解决方案,也请寻找PyCapsule。

简而言之,将结构添加到代码的cdef extern from "customlib.h":部分中,该结构将在Cython级别可用。