Python调用C语言的实现


Posted in Python onJuly 26, 2019

Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。

示例如下

实现两数求和的C代码,保存为add.c

//sample C file to add 2 numbers - int and floats

#include <stdio.h>

int add_int(int, int);
float add_float(float, float);

int add_int(int num1, int num2){
  return num1 + num2;

}

float add_float(float num1, float num2){
  return num1 + num2;

}

接下来将C文件编译为.so文件(windows下为DLL)。下面操作会生成adder.so文件

#For Linux
$ gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c

#For Mac
$ gcc -shared -Wl,-install_name,adder.so -o adder.so -fPIC add.c

#For windows
$
gcc -shared -Wl,-soname,adder -o adder.dll -fPIC add.c

现在在你的Python代码中来调用它

from ctypes import *

#load the shared object file
adder = CDLL('./adder.so')

#Find sum of integers
res_int = adder.add_int(4,5)
print "Sum of 4 and 5 = " + str(res_int)

#Find sum of floats
a = c_float(5.5)
b = c_float(4.1)

add_float = adder.add_float
add_float.restype = c_float
print "Sum of 5.5 and 4.1 = ", str(add_float(a, b))

输出如下

Sum of 4 and 5 = 9
Sum of 5.5 and 4.1 =  9.60000038147

在这个例子中,C文件是自解释的,它包含两个函数,分别实现了整形求和和浮点型求和。

在Python文件中,一开始先导入ctypes模块,然后使用CDLL函数来加载我们创建的库文件。这样我们就可以通过变量adder来使用C类库中的函数了。当adder.add_int()被调用时,内部将发起一个对C函数add_int的调用。ctypes接口允许我们在调用C函数时使用原生Python中默认的字符串型和整型。

而对于其他类似布尔型和浮点型这样的类型,必须要使用正确的ctype类型才可以。如向adder.add_float()函数传参时, 我们要先将Python中的十进制值转化为c_float类型,然后才能传送给C函数。这种方法虽然简单,清晰,但是却很受限。例如,并不能在C中对对象进行操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 正则表达式 概述及常用字符
May 04 Python
Pyramid添加Middleware的方法实例
Nov 27 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
带你了解python装饰器
Jun 15 Python
matplotlib设置legend图例代码示例
Dec 19 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
Python with标签使用方法解析
Jan 17 Python
如何基于Django实现上下文章跳转
Sep 16 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 #Python
对Django外键关系的描述
Jul 26 #Python
python绘图模块matplotlib示例详解
Jul 26 #Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 #Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 #Python
Django Rest framework频率原理与限制
Jul 26 #Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 #Python
You might like
PHP初学者头疼问题总结
2006/10/09 PHP
PHP安全技术之 实现php基本安全
2010/09/04 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Django中的Model操作表的实现
2018/07/24 Python
python实现停车管理系统
2018/11/30 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Python print不能立即打印的解决方式
2020/02/19 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
会展中心部门工作职责
2013/11/27 职场文书
诚信考试标语
2014/06/24 职场文书
关于读书的活动方案
2014/08/14 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
小平您好观后感
2015/06/09 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers