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