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 with的用法
Aug 22 Python
在Python中操作日期和时间之gmtime()方法的使用
May 22 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
对python 自定义协议的方法详解
Feb 13 Python
详解用Python练习画个美队盾牌
Mar 23 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
Jupyter notebook 远程配置及SSL加密教程
Apr 14 Python
Python和Bash结合在一起的方法
Nov 13 Python
python3实现飞机大战
Nov 29 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 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中http_build_query 的一个问题
2012/03/25 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
浅谈PHP中Stream(流)
2015/06/08 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
Python语言描述随机梯度下降法
2018/01/04 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
美国休闲服装品牌:Express
2016/09/24 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
装潢设计专业推荐信模板
2013/11/26 职场文书
大门门卫岗位职责
2013/11/30 职场文书
小学开学寄语
2014/01/19 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
企业领导对照检查材料
2014/08/20 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
离婚纠纷代理词
2015/05/23 职场文书
人生遥控器观后感
2015/06/11 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript