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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
详解python中的线程与线程池
May 10 Python
Python转换时间的图文方法
Jul 01 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
python mysql中in参数化说明
Jun 05 Python
python中opencv实现图片文本倾斜校正
Jun 11 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
Python实现简单的可逆加密程序实例
2015/03/05 Python
Django中信号signals的简单使用方法
2019/07/04 Python
详解python解压压缩包的五种方法
2019/07/05 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
中文系师范生自荐信
2013/10/01 职场文书
护士实习自我鉴定
2013/10/22 职场文书
学生会离职感言
2014/02/11 职场文书
学风建设演讲稿
2014/09/12 职场文书
白鹤梁导游词
2015/02/06 职场文书
2016新年致辞
2015/08/01 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
DE1103使用报告
2022/04/05 无线电