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中用get()方法获取字典键值的教程
May 21 Python
Python的Django框架中的表单处理示例
Jul 17 Python
python dataframe astype 字段类型转换方法
Apr 11 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Python面向对象之类的封装操作示例
Jun 08 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
python的range和linspace使用详解
Nov 27 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
Django URL参数Template反向解析
Nov 24 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
php4的session功能评述(三)
2006/10/09 PHP
PHP脚本数据库功能详解(下)
2006/10/09 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
2017/03/30 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
python自动化测试之连接几组测试包实例
2014/09/28 Python
python抖音表白程序源代码
2019/04/07 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
Python如何安装第三方模块
2020/05/28 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
公司庆典活动邀请函
2014/01/09 职场文书
全国文明单位申报材料
2014/05/31 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python