python调用C语言步骤

图片来源于网络,在这里非常感谢那位老师。


最后代码注释的图中有个人总结:


说明: text.c 是我的 C语言功能函数文件,text是我的想要把text.c文件打包之后的包名,te.c是包裹文件(Python与C 之间的桥梁),text.h是我的头文件

python调用C语言步骤

若是setup.py 与 text.c 、te.c 不在一个目录下,需要修改setup.py中的相关路劲

python调用C语言步骤

python调用C语言步骤


python调用C语言步骤

首先安装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语言。

python调用C语言步骤python调用C语言步骤

python调用C语言步骤



2:Python与C语言的数据类型对照表

python调用C语言步骤

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

python调用C语言步骤python调用C语言步骤


te.c

python调用C语言步骤

setup.py

python调用C语言步骤python调用C语言步骤

text.h

python调用C语言步骤python调用C语言步骤