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之re操作方法(详解)
Jun 14 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
python使用turtle库绘制树
Jun 25 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
解决python文件双击运行秒退的问题
Jun 24 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
python实现井字棋小游戏
Mar 04 Python
python自动化调用百度api解决验证码
Apr 13 Python
Python数据类型最全知识总结
May 31 Python
FP-growth算法发现频繁项集——构建FP树
Jun 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
PHP 调试工具Debug Tools
2011/04/30 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
Python实现ssh批量登录并执行命令
2016/10/25 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
python地震数据可视化详解
2019/06/18 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
python opencv肤色检测的实现示例
2020/12/21 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
自动化系在校本科生求职信
2013/10/23 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
父母寄语大全
2014/04/12 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
手残删除python之后的补救方法
2021/06/26 Python
Golang 字符串的常见操作
2022/04/19 Golang