神奇的python(三)之Python扩展C/C++库(C转换为Python)
一、 简介
Python是个非常流行的解释型脚本语言。而C是一个非常流行的编译语言。由于其编译的性质,导致C一般比Python要快,但是它是更底层的。相对的,Python编程更加快速和简单。故而将C库作为Python库的扩展极为必要,使得Python既融合了自身的优点,又融合了C语言的优点,正是因为这些性质使得Python越来越流行。
二、手写扩展C库
(1) 准备一个需要转换的C源代码文件,如果没有可以参考以下代码(c源文件名: Conver_Test.c):
void Table99(int n)
{int i, j;for(i = 1; i <= n; i++){for(j = 1; j <= n; j++){printf("%d*%d=%-4d", i, j, i*j);}printf("\n");}
}void Fabocci(void)
{long int f1, f2;f1 = f2 = 1;int i;for(i = 1; i <= 20; i++){printf("%12ld %12ld", f1, f2);if(i % 2 == 0)printf("\n");f1 = f1 + f2;f2 = f1 + f2;}
}int Max_value(int value1, int value2)
{if(value1 > value2){return value1;}return value2;
}
不知道大家注意到没有, 上述的三个函数分别是"有参数, 没有返回值", “没有参数, 没有返回值”, “有参数, 有返回值”, 这样就能更清晰的描述该如何把C转换成Python库, 让大家少走弯路.
最后还有一点, 可以发现上述代码没有main( )函数, 所以想测试上述提供的代码, 可在最后添加:
int main(void)
{int Test = 0;Table99(9);Fabocci();Test = Max_value(9, 4);printf("Max_value = %d", Test);
}
C源代码测试完毕后, 请务必把main( )函数删除, 以减少后面忘了删除, 导致转换不成功.
(2) 添加导入函数
什么是导入函数?
答:我的理解导入函数就是通过Python函数调用C函数的关键, 他会判断输入是否有误, 然后调用C函数,并返回C函数的返回值.
以下是我为三个C函数写的导入函数:
static PyObject * Conver_Test_Table99(PyObject *self, PyObject *args)
{int num; //参数// 判断输入的参数是否为整型, 如果不是返回一个NULL值, i 表示整型, &num为输入参数if(!(PyArg_ParseTuple(args, "i", &num))){return NULL;}Table99(num); // 执行C函数return (PyObject *)Py_BuildValue(""); // 把C函数中计算的结果转换成Python对象并返回
}static PyObject * Conver_Test_Fabocci(PyObject *self, PyObject *args)
{Fabocci();return (PyObject *)Py_BuildValue("");
}static PyObject * Conver_Test_Max_value(PyObject *self, PyObject *args)
{int num1, num2;// "ii"表示两个整型参数if(!(PyArg_ParseTuple(args, "ii", &num1, &num2))){return NULL;}return (PyObject *)Py_BuildValue("i", Max_value(num1, num2));
}
想了解更多关于PyArg_ParseTuple, Py_BuildValue, 请参考以下官方图片:
(3) 添加Python方法
static PyMethodDef Conver_Test_Methods[] = {{"Table99", Conver_Test_Table99, METH_VARARGS},{"Fabocci", Conver_Test_Fabocci, METH_VARARGS},{"Max_value", Conver_Test_Max_value, METH_VARARGS},{NULL, NULL},
};
(4) 添加模块初始化
void initConver_Test(void)
{Py_InitModule("Conver_Test", Conver_Test_Methods);
}
添加模块初始化有一点需要注意: 该函数命名格式为init+文件名
至此, 一个手写的C转PYTHON库文件已经写好了, 接下来就剩编译了.
(5) 编译成PYTHON库
编译成C库有两种方法:
① 直接执行命令
命令: gcc -shared -fPIC Conver_Test.c -I/usr/include/python2.7/ -L/usr/lib -lpython2.7 -o Conver_Test.so
注意: 根据python的版本进行相应的更改, 我的python版本为2.7, 如果是其他版本,请注意.
编译完成后, 可在当前目录下查看到相应的Python库文件
② 通过setup库进行编译
- 编写setup.py文件, 请参考以下代码:
#!/usr/bin/env pthonfrom distutils.core import setup, Extension
MOD = 'Conver_Test' #库文件名称example_module = Extension(MOD, sources=['Conver_Test.c'], ) #C文件名称setup(name=MOD,ext_modules = [example_module],)
- 通过setup.py文件进行编译
命令: python setup.py build
编译完成后, 可在/build/…/…找到相应库文件
(6) 开始运行测试吧
>>> import Conver_Test
>>> Conver_Test.Fabocci()1 1 2 35 8 13 2134 55 89 144233 377 610 9871597 2584 4181 676510946 17711 28657 4636875025 121393 196418 317811514229 832040 1346269 21783093524578 5702887 9227465 1493035224157817 39088169 63245986 102334155
三、通过swing扩展C库
(1) 安装swig
命令: sudo apt-get install swig
(2) 准备好要转换的C源文件和C头文件, 可参考下面的代码:
/* File:Conver_Testswig.h */dvoid Table99(int n);
void Fabocci(void);
int Max_value(int value1, int value2);
/* File:Conver_Testswig.c */#include <stdio.h>
#include "Conver_Testswig.h"void Table99(int n)
{int i, j;for(i = 1; i <= n; i++){for(j = 1; j <= n; j++){printf("%d*%d=%-4d", i, j, i*j);}printf("\n");}
}void Fabocci(void)
{long int f1, f2;f1 = f2 = 1;int i;for(i = 1; i <= 20; i++){printf("%12ld %12ld", f1, f2);if(i % 2 == 0)printf("\n");f1 = f1 + f2;f2 = f1 + f2;}
}int Max_value(int value1, int value2)
{if(value1 > value2){return value1;}return value2;
}
(3) 创建一个 .i 文件来配置swig
/* File:Conver_Testswig.i */%module Conver_Testswig%{
#define SWIG_FILE_WITH_INIT
#include "Conver_Testswig.h"
%}void Table99(int n);
void Fabocci(void);
int Max_value(int value1, int value2);
简单介绍:
%module Conver_Testswig 用于配置swig后产生的文件名称
#define SWIG_FILE_WITH_INIT 规定这个C文件将会编译成Python模块
#include "Conver_Testswig.h" 包含头文件
(4) 配置swig
命令: swig -python Conver_Testswig.i
执行该命令会生成一个Conver_Testswig_wrap.c和Conver_Testswig.py文件则代表你配置成功了.
(5) 通过setup库进行编译
① 编写setup.py文件, 请参考以下代码:
#!/usr/bin/env pthonfrom distutils.core import setup, Extension
MOD = '_Conver_Testswig'example_module = Extension(MOD, sources=['Conver_Testswig_wrap.c', 'Conver_Testswig.c'], )setup(name=MOD,ext_modules = [example_module],)
敲黑板: 请务必注意生成目标文件名称需要加"_"
② 通过setup.py文件进行编译
命令: python setup.py build
编译完成后, 可在/build/…/…找到相应库文件
(6) 开始运行测试吧
>>> import _Conver_Testswig
>>>
>>> _Conver_Testswig.Table99(9)
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
以下隐藏内容为源代码,有需求可以下载,当作是对本站的支持,谢谢。
[erphpdown]解压密码:ZMJPY123[/erphpdown]
神奇的python(三)之Python扩展C/C++库(C转换为Python)相关推荐
- python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...
[填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...
- python语言特点粘性扩展_【语言处理与Python】9.2处理特征结构\9.3扩展基于特征的文法...
9.2处理特征结构 这一节内容为如何构建特征结构以及在NLTK中操作. NLTK提供了特征结构使用的构造函数FeatStruct()声明. >>>fs1 = nltk.FeatStr ...
- python三种数据类型详解_最全面的Python数据类型知识点讲解
1.字符串 字符串常用功能 name = 'derek'print(name.capitalize()) #首字母大写 Derek print(name.count("e" ...
- python如何封装成可调用的库_在python中如何以异步的方式调用第三方库提供的同步API...
在关于asyncio的基本用法中提到,asyncio并不是多线程.在协程中调用同步(阻塞函数),都占用同一线程的CPU时间,即当前线程会被阻塞(即协程只会在等待一个协程时可能出让CPU,如果是普通函数 ...
- python和verilog对接_用这个库居然可以使用Python进行FPGA逻辑开发
未经私信同意禁止转载! 不好意思,又标题党了,为了骗阅读量没办法... 前言 今天为大家介绍一下python的MyHDL 库.MyHDL项目的目标是通过python语言的优雅和简洁性来增强硬件设计者的 ...
- python视频处理教程_Python视频编辑库:MoviePy|python爬虫|python入门|python教程
https://www.xin3721.com/eschool/pythonxin3721/ MoviePy MoviePy是一个关于视频编辑的python库,主要包括:剪辑,嵌入拼接,标题插入,视频 ...
- Python第一天:你必须要知道的Python擅长领域以及各种重点学习框架(包含Python在世界上...
[toc] 今天开始将会发布系列型的Python学习, 今天讲述的框架相对来说比较多,只能一一例举出来, 无法进行准确的 Python5大擅长领域 很多学Python的小伙伴, 转行, 或者兴趣还有就 ...
- Python第一天:你必须要知道的Python擅长领域以及各种重点学习框架(包含Python在世界上的应用)
文章目录 Python5大擅长领域 WEB开发 网络编程 科学运算 GUI图形开发 运维自动化 Python在世界上的知名应用 国外 谷歌 CIA NASA YouTube Dropbox Insta ...
- python 参数封装_扩展Python模块系列(三)----参数解析与结果封装
在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...
最新文章
- [ATF]-MTK:一篇文章了解ATF原理
- ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing.
- Google Earth KML格式成为开放式国际标准
- java传输文件暂停_java – 在文件下载中实现暂停/恢复
- java finally什么时候不执行_Java 中的 finally 一定会被执行吗?
- 带你自学Python系列(八):列表具体操作思维导图总结,再也不用翻书查用法了!...
- python function terminated un_Python: 僵尸进程的产生和清除方法
- 如何保障大数据环境下的数据安全
- Apache Hadoop 2.4.1完全分布式集群安装
- flash发布html快捷键,flash快捷键大全
- 大学生暑期实践活动---关注少数民族孤寡老人
- C#实现图书管理系统(课程设计)——第五步、查询界面及操作
- linux mtd 指令,mtd交叉编译mkfs命令
- BP客户主数据信用数据批量修改
- 不愧是阿里P8!java如何遍历链表
- java 获取周六周日_JS实现获取当前所在周的周六、周日示例分析
- Monthly Expense(二分专题)
- java web前台概览
- 冯·诺依曼结构计算机的存储器和数据
- 当我真正开始爱自己——来自UOU的馈赠
热门文章
- 设置jstree只展示到2级_你做的私域流量属于什么级别?80%的商家都还只在第2级...
- 安卓 spinner下拉框 做模糊查询_用图表控件做一个简单的员工信息查询系统
- AttributeError: ‘str‘ object has no attribute ‘copy
- C++:两种类实例化
- ip中继对接_朗视IPPBX为桃源居中澳实验学校打造IP语音校园!
- FastCGI - Getting Request URI and Content in C++ FCGI
- css文字排列 - 代码篇
- dedeCMS 静态页面的倒计时插件(原生VS自定义)
- 得推乡镇拼车系统源码v1.0
- DBX到PDF转换器