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之hello world
May 21 Python
在Linux中通过Python脚本访问mdb数据库的方法
May 06 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
在python3中实现更新界面
Feb 21 Python
python实现与redis交互操作详解
Apr 21 Python
python爬虫中的url下载器用法详解
Nov 30 Python
ASP.NET Core中的配置详解
Feb 05 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 SQL防注入代码集合
2008/04/25 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
Vue.directive使用注意(小结)
2018/08/31 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
python画一个玫瑰和一个爱心
2020/08/18 Python
python如何实现一个刷网页小程序
2018/11/27 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
周末问候语大全
2015/11/10 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL