我正在使用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
是用户定义的类型,而不是int
,double
等,该怎么办?我尝试与之交互的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接口代码,我需要采取什么步骤?
答案 0 :(得分:1)
您必须创建一个包含C变量的容器类。 C变量(数字和字符除外)不能在Python级别按原样传递。如果您要在此处使用标准解决方案,也请寻找PyCapsule。
简而言之,将结构添加到代码的cdef extern from "customlib.h":
部分中,该结构将在Cython级别可用。