使用Cython作为C包装器

时间:2018-03-08 23:10:44

标签: c python-2.7 cython wrapper compiler-optimization

Python文档中的示例描述了如何一次性包装结构,处理内存分配和函数。我也不明白setup.py文件是如何编译我的C代码的。有人可以给我一个简单的例子来说明如何使用Cython和gcc编译器进行包装,说一个hello world程序吗?

1 个答案:

答案 0 :(得分:1)

你需要一个C文件来包含C函数(base_hello.c),一个C头文件包含那些C函数的声明(base_hello.h),以及一个cython文件来告诉cython如何转换这些C函数到python函数(hello.pyx)。以下是它们各自包含的内容:

<强> base_hello.c

#include <stdio.h>
#include "base_hello.h"

int print_hello_world(int N_prints){

    for (int i=0; i<N_prints; i++){
        printf("%i Hello World\n",i);
    }

    return 2*N_prints;
}

<强> base_hello.h

int print_hello_world(int N_prints);

<强> hello.pyx

cdef extern from "base_hello.h":
    int print_hello_world(int N_prints);

def run_print_hello_world(N_prints):
    return print_hello_world(N_prints)

然后,您需要将base_hello.c编译为目标文件,然后将hello.pyx文件编译为共享对象,然后可以将其导入到python中。基本上hello.pyx告诉Cython如何将C函数转换为python函数。您可以使用根据cython文档创建的setup.py或使用类似以下编译命令的内容来编译这些文件,您肯定希望更改python实例的路径:

cython -v -2 hello.pyx
cc -shared -fPIC -I"/Users/michael/miniconda2/include/python2.7" -o hello.so hello.c base_hello.c

要测试这是否有效,这是一个简单的测试脚本test_hello.py。

<强> test_hello.py

import hello

for i in range(4):
    print 'TESTING %i PRINTS'%i
    hello.run_print_hello_world(i)

运行“python test_hello.py”应该输出以下内容:

TESTING 0 PRINTS
TESTING 1 PRINTS
0 Hello World
TESTING 2 PRINTS
0 Hello World
1 Hello World
TESTING 3 PRINTS
0 Hello World
1 Hello World
2 Hello World