一、 简介

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)相关推荐

  1. python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...

    [填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...

  2. python语言特点粘性扩展_【语言处理与Python】9.2处理特征结构\9.3扩展基于特征的文法...

    9.2处理特征结构 这一节内容为如何构建特征结构以及在NLTK中操作. NLTK提供了特征结构使用的构造函数FeatStruct()声明. >>>fs1 = nltk.FeatStr ...

  3. python三种数据类型详解_最全面的Python数据类型知识点讲解

    1.字符串 字符串常用功能 name = 'derek'print(name.capitalize())    #首字母大写  Derek print(name.count("e" ...

  4. python如何封装成可调用的库_在python中如何以异步的方式调用第三方库提供的同步API...

    在关于asyncio的基本用法中提到,asyncio并不是多线程.在协程中调用同步(阻塞函数),都占用同一线程的CPU时间,即当前线程会被阻塞(即协程只会在等待一个协程时可能出让CPU,如果是普通函数 ...

  5. python和verilog对接_用这个库居然可以使用Python进行FPGA逻辑开发

    未经私信同意禁止转载! 不好意思,又标题党了,为了骗阅读量没办法... 前言 今天为大家介绍一下python的MyHDL 库.MyHDL项目的目标是通过python语言的优雅和简洁性来增强硬件设计者的 ...

  6. python视频处理教程_Python视频编辑库:MoviePy|python爬虫|python入门|python教程

    https://www.xin3721.com/eschool/pythonxin3721/ MoviePy MoviePy是一个关于视频编辑的python库,主要包括:剪辑,嵌入拼接,标题插入,视频 ...

  7. Python第一天:你必须要知道的Python擅长领域以及各种重点学习框架(包含Python在世界上...

    [toc] 今天开始将会发布系列型的Python学习, 今天讲述的框架相对来说比较多,只能一一例举出来, 无法进行准确的 Python5大擅长领域 很多学Python的小伙伴, 转行, 或者兴趣还有就 ...

  8. Python第一天:你必须要知道的Python擅长领域以及各种重点学习框架(包含Python在世界上的应用)

    文章目录 Python5大擅长领域 WEB开发 网络编程 科学运算 GUI图形开发 运维自动化 Python在世界上的知名应用 国外 谷歌 CIA NASA YouTube Dropbox Insta ...

  9. python 参数封装_扩展Python模块系列(三)----参数解析与结果封装

    在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...

最新文章

  1. [ATF]-MTK:一篇文章了解ATF原理
  2. ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing.
  3. Google Earth KML格式成为开放式国际标准
  4. java传输文件暂停_java – 在文件下载中实现暂停/恢复
  5. java finally什么时候不执行_Java 中的 finally 一定会被执行吗?
  6. 带你自学Python系列(八):列表具体操作思维导图总结,再也不用翻书查用法了!...
  7. python function terminated un_Python: 僵尸进程的产生和清除方法
  8. 如何保障大数据环境下的数据安全
  9. Apache Hadoop 2.4.1完全分布式集群安装
  10. flash发布html快捷键,flash快捷键大全
  11. 大学生暑期实践活动---关注少数民族孤寡老人
  12. C#实现图书管理系统(课程设计)——第五步、查询界面及操作
  13. linux mtd 指令,mtd交叉编译mkfs命令
  14. BP客户主数据信用数据批量修改
  15. 不愧是阿里P8!java如何遍历链表
  16. java 获取周六周日_JS实现获取当前所在周的周六、周日示例分析
  17. Monthly Expense(二分专题)
  18. java web前台概览
  19. 冯·诺依曼结构计算机的存储器和数据
  20. 当我真正开始爱自己——来自UOU的馈赠

热门文章

  1. 设置jstree只展示到2级_你做的私域流量属于什么级别?80%的商家都还只在第2级...
  2. 安卓 spinner下拉框 做模糊查询_用图表控件做一个简单的员工信息查询系统
  3. AttributeError: ‘str‘ object has no attribute ‘copy
  4. C++:两种类实例化
  5. ip中继对接_朗视IPPBX为桃源居中澳实验学校打造IP语音校园!
  6. FastCGI - Getting Request URI and Content in C++ FCGI
  7. css文字排列 - 代码篇
  8. dedeCMS 静态页面的倒计时插件(原生VS自定义)
  9. 得推乡镇拼车系统源码v1.0
  10. DBX到PDF转换器