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 的 Socket 编程
Mar 24 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
Python实现字典按照value进行排序的方法分析
Dec 23 Python
python读取和保存视频文件
Apr 16 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
详解PHP归并排序的实现
2016/10/18 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
layui导航栏实现代码
2017/05/19 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
实例讲解Python中函数的调用与定义
2016/03/14 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
写给女朋友的检讨书
2014/01/28 职场文书
学生会离职感言
2014/02/11 职场文书
内勤主管岗位职责
2014/04/03 职场文书
秋冬农业生产标语
2014/10/09 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
2015年小学语文工作总结
2015/05/25 职场文书