使用python调用c源码(官方文档翻译向)

使用python调用c源码(官方文档翻译向)

前言

教大家一个巧妙的提高自己喜欢语言的方法。比如你喜欢使用python,而在别人谈论其他语言的时候,你便可以嘲讽他说:“python可以调用它吗?”哈哈,皮一下真开心。

好了闲话少叙。先送上官方文档

python调用c源码

当天你想调用已经编译好的lib,强大的cffi也是可以的。具体可以看上方文档中的其他部分。而如果你有了现成的源码其实也是很简单的。只有遵循以下步骤就可以了。

步骤1:创建c源码和c的头文件

pi.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* filename: pi.c*/
# include <stdlib.h>
# include <math.h>
/* Returns a very crude approximation of Pi
given a int: a number of iteration */
float pi_approx(int n){
double i,x,y,sum=0;
for(i=0;i<n;i++){
x=rand();
y=rand();
if (sqrt(x*x+y*y) < sqrt((double)RAND_MAX*RAND_MAX))
sum++; }
return 4*(float)sum/(float)n; }

pi.h

1
2
/* filename: pi.h*/
float pi_approx(int n);

步骤2:编写py脚本生成c扩展

pi_extension_build.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from cffi import FFI
ffibuilder = FFI()
ffibuilder.cdef("float pi_approx(int n);")
ffibuilder.set_source("_pi", # name of the output C extension
"""
#include "pi.h"',
""",
sources=['pi.c'], # includes pi.c as additional sources
libraries=['m']) # on Unix, link with the math library 这里要写c试用的lib的名称这是linux下的所以是m
if __name__ == "__main__":
ffibuilder.compile(verbose=True)

好了现在命令行下运行python pi_extension_build.py

如果没有问题的情况下你的文件夹下会出现一些东西。放心这是正常的。

步骤3:直接调用你刚才生成的模块

现在你就可调用到这个刚刚写好的函数了。比如像下面的代码:

1
2
3
4
5
6
7
from _pi.lib import pi_approx
approx = pi_approx(10)
assert str(pi_approximation).startswith("3.")
approx = pi_approx(10000)
assert str(approx).startswith("3.1")

就是这么简单是不是so easy!

我将一直的无知与迷惑,我是黄油香蕉君,再见。

给作者买杯咖啡吧。喵~