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传递中文参数的问题
Aug 04 Python
python 简单的多线程链接实现代码
Aug 28 Python
Django的信号机制详解
May 05 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
python多线程并发实例及其优化
Jun 27 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
关于python中readlines函数的参数hint的相关知识总结
Jun 24 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
PHP 采集程序 常用函数
2008/12/18 PHP
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
python多线程编程方式分析示例详解
2013/12/06 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
原生python实现knn分类算法
2019/10/24 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
2015年纪委工作总结
2015/05/13 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis