Python调用C语言的方法【基于ctypes模块】


Posted in Python onJanuary 22, 2018

本文实例讲述了Python调用C语言的方法。分享给大家供大家参考,具体如下:

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 相关文章推荐
Python简单进程锁代码实例
Apr 27 Python
python类和继承用法实例
Jul 07 Python
python访问mysql数据库的实现方法(2则示例)
Jan 06 Python
答题辅助python代码实现
Jan 16 Python
Django用户认证系统 组与权限解析
Aug 02 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
keras topN显示,自编写代码案例
Jul 03 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python实现抖音热搜定时爬取功能
Mar 16 Python
python的Crypto模块实现AES加密实例代码
Jan 22 #Python
python实现求最长回文子串长度
Jan 22 #Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 #Python
Linux CentOS7下安装python3 的方法
Jan 21 #Python
简述Python2与Python3的不同点
Jan 21 #Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 #Python
分析Python中解析构建数据知识
Jan 20 #Python
You might like
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
PHP编程函数安全篇
2013/01/08 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
javascript中的对象创建 实例附注释
2011/02/08 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
python使用str &amp; repr转换字符串
2016/10/13 Python
Python MD5加密实例详解
2017/08/02 Python
python实现括号匹配的思路详解
2018/08/23 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
民族团结演讲稿范文
2014/08/27 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
嘉宾邀请函
2015/01/31 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
《风筝》教学反思
2016/02/23 职场文书
Python数据分析之绘图和可视化详解
2021/06/02 Python
P站美图推荐——变身女主角特辑
2022/03/20 日漫