Python调用C语言的实现


Posted in Python onJuly 26, 2019

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读取html中指定元素生成excle文件示例
Apr 03 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
pycharm安装和首次使用教程
Aug 27 Python
python如何实现异步调用函数执行
Jul 08 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
Python中格式化字符串的四种实现
May 26 Python
python能自学吗
Jun 18 Python
Django自带的用户验证系统实现
Dec 18 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
Pytorch使用shuffle打乱数据的操作
May 20 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 #Python
对Django外键关系的描述
Jul 26 #Python
python绘图模块matplotlib示例详解
Jul 26 #Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 #Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 #Python
Django Rest framework频率原理与限制
Jul 26 #Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 #Python
You might like
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
用JQUERY增删元素的代码
2012/02/14 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
python根据经纬度计算距离示例
2014/02/16 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
Python常见字典内建函数用法示例
2018/05/14 Python
python如何制作英文字典
2019/06/25 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
医药代表个人求职信范本
2013/12/19 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
工商管理本科生求职信
2014/07/13 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
门球健将观后感
2015/06/16 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库