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之Python文档
Oct 10 Python
Python注释详解
Jun 01 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Django urls.py重构及参数传递详解
Jul 23 Python
Python 如何提高元组的可读性
Aug 26 Python
python manage.py runserver流程解析
Nov 08 Python
Python定义一个函数的方法
Jun 15 Python
python 实现端口扫描工具
Dec 18 Python
Django中的JWT身份验证的实现
May 07 Python
Python极值整数的边界探讨分析
Sep 15 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文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
vue-cli的eslint相关用法
2017/09/29 Javascript
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python rsa 加密解密
2017/03/20 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
django中模板的html自动转意方法
2018/05/27 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
python字符串格式化方式解析
2019/10/19 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
浅析python实现动态规划背包问题
2020/12/31 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
2015年小学开学寄语
2015/02/27 职场文书
教师继续教育反思周记
2015/06/25 职场文书