python调用C语言步骤
图片来源于网络,在这里非常感谢那位老师。
最后代码注释的图中有个人总结:
说明: text.c 是我的 C语言功能函数文件,text是我的想要把text.c文件打包之后的包名,te.c是包裹文件(Python与C 之间的桥梁),text.h是我的头文件
若是setup.py 与 text.c 、te.c 不在一个目录下,需要修改setup.py中的相关路劲
首先安装Python 和Python 库,其中Python.h在Python库中,
安装python-dev(Python库),这是Python的头文件和静态库包: sudo apt-get install python-dev
1:Python 与C的 关系图(Python与C语言毕竟是两门语言,不能直接从Python调用C,Python可以间接调用C,所以从Python到C之间必须要有一个桥梁,而这个桥梁就是包裹模块,Python能够识别包裹模块,包裹模块又能识别C语言),包裹模块的作用,就是把Python传递过来的数据类型转化为C语言的数据类型,然后传给C语言。
2:Python与C语言的数据类型对照表
3:实现包裹(就是建立一个xxx.c文件----->我创建的是te.c文件,在这个文件中实现以下四个功能)的四大步:
a.包含Python.h头文件 (在主机上下载Python库,sudo
apt-get install python-dev,然后 #include"python.h");
b.为每一个函数增加一个PyObject * Module_func()的包裹函数(PyObject 是Python的数据类型,Module是我们自己将要打包的C语言的包名,func
是我们
的C函数的函数名,PyObject * Module_func()函数的函数体由我们自己定义,只要能完成Python 与 c语言之间的数据类型的转换就行)
c.为模块增加一个PyMethod DefModuleMethods[]的数组(将我们的所有c函数)
d.增加模块的初始化函数void initModule() --》(将c函数包名和函数名注册到Python中)
4:编译并且安装到python环境
a.创建setup.py,并添加如下内容:
vi setup.py
#! /usr/bin/env python
from distutils.core import setup, Extension (导入setup和Extension两个功能模块)
MOD = "text" (text是我自己想要生成的C 函数包名)
setup(name=MOD, ext_modules=[Extension(MOD, sources=['text.c', 'te.c'])])
b.运行setup.py编译和链接C的扩展代码sudo python setup.py
install
安装
C的扩展代码 sudo python setup.py install
c. 从Python中导入模块,测试
$ ipython
import text
text.fac(5)
120
源代码 如下
text.c
te.c
setup.py
text.h