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中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
详解python中的hashlib模块的使用
Apr 22 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP SQLite类
2009/05/07 PHP
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
PHP7.0版本备注
2015/07/23 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
php生成验证码函数
2015/10/20 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
Python爬虫框架Scrapy实例代码
2018/03/04 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
python的sorted用法详解
2019/06/25 Python
Python中zip函数如何使用
2020/06/04 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
文秘专业大学生求职信
2013/11/10 职场文书
住房租房协议书
2014/08/20 职场文书
资料员岗位职责
2015/02/10 职场文书
中学总务处工作总结
2015/08/12 职场文书