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 encode和decode的妙用
Sep 02 Python
python list转dict示例分享
Jan 28 Python
python判断、获取一张图片主色调的2个实例
Apr 10 Python
python中cPickle类使用方法详解
Aug 27 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
Python sys模块常用方法解析
Feb 20 Python
python实现电子词典
Mar 03 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python中yield的用法详解
Jan 13 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 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程序
2006/10/09 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
php学习笔记 数组的常用函数
2011/06/13 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
政府采购方案
2014/06/12 职场文书
人事专员岗位说明书
2014/07/29 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
教师辞职信范文
2015/02/28 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
重阳节简报
2015/07/20 职场文书
八年级英语教学反思
2016/02/15 职场文书
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server