在实际开发过程中,由于有些经典高效的库是由C写的,尤其涉及到计算密集型的,python很难做到高效,因此我们需要实现将C库作为模块引入python,供我们使用,在这个过程里面,希望大家少踩坑
我们来以一个小demo为例,这里首先展示下demo目录结构
demo
-- install.sh # sh构建文件
-- main.py # 测试文件
-- setup.py # 构建py扩展库文件
-- test.c # C扩展库
install.sh
python3 setup.py install
rm -rf ./dist
rm -rf ./build
setup.py
from distutils.core import setup, Extension
setup(name='aaa', # 定义的模块名
version='1.0',
ext_modules=[
Extension('aaa', ['test.c']) # aaa为c文件中定义的模块名,test.c为 c文件路径
]
)
test.c 简单的fib函数封装,以下内容为python3的封装方式,python2可自行百度
main.py 测试c扩展库是否构建成功
import aaa
if __name__ == '__main__':
for num in range(10):
print(aaa.fib(num))
需要注意的是,你期待生成的模块名需与c文件中几个关键的名称须保持一致
也就是以上例子中setup.py和test.c中所有为aaa的地方
以上文件准备好后,开始打包
首先进入demo目录
cd demo
执行构建sh文件
install.sh
不报错即构建成功
测试:
在demo目录下执行
python3 main.py
正常输出:
0
1
1
2
3
5
8
13
21
34
如果执行测试脚本时提示导入模块问题,例:
ImportError:The dynamic module does not define the init function
请检查 期待生成的模块名需与c文件中几个关键的名称须保持一致,即以上例子中setup.py和test.c中所有为aaa的地方
本文完结!