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根据给定文件返回文件名和扩展名的方法
Mar 27 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
Python实现命令行通讯录实例教程
Aug 18 Python
Python制作词云的方法
Jan 03 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
基于python实现学生管理系统
Oct 17 Python
python 实现兔子生兔子示例
Nov 21 Python
python返回数组的索引实例
Nov 28 Python
举例讲解Python装饰器
Dec 24 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
Python 数据可视化之Seaborn详解
Nov 02 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注释实例技巧
2008/10/03 PHP
php 购物车完整实现代码
2014/06/05 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
详解python播放音频的三种方法
2019/09/23 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
个人对照检查材料
2014/02/12 职场文书
学习决心书范文
2014/03/11 职场文书
分公司任命书
2014/06/06 职场文书
学校献爱心活动总结
2014/07/08 职场文书
先进工作者个人总结
2015/02/15 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
田径运动会通讯稿
2015/07/18 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
生产车间管理制度
2015/08/04 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python
Python读取和写入Excel数据
2022/04/20 Python
Linux中文件的基本属性介绍
2022/06/01 Servers
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL