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 相关文章推荐
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
浅谈Python爬虫基本套路
Mar 25 Python
如何基于Python创建目录文件夹
Dec 31 Python
Python如何生成xml文件
Jun 04 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
python爬虫beautifulsoup解析html方法
Dec 07 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
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
js选择器全面解析
2016/06/27 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
python变量不能以数字打头详解
2016/07/06 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
python把1变成01的步骤总结
2019/02/27 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
python实现四人制扑克牌游戏
2020/04/22 Python
python 如何设置守护进程
2020/10/29 Python
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
架构师岗位职责
2013/11/18 职场文书
卫校护理专业毕业生求职信
2013/11/26 职场文书
单位办理社保介绍信
2014/01/10 职场文书
公司员工安全协议书
2014/11/21 职场文书
大学毕业生个人总结
2015/02/28 职场文书
离职证明格式样本
2015/06/12 职场文书
《植树问题》教学反思
2016/03/03 职场文书
python编写五子棋游戏
2021/05/25 Python