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 不关闭控制台的实现方法
Oct 23 Python
python采集博客中上传的QQ截图文件
Jul 18 Python
python将unicode转为str的方法
Jun 21 Python
python树莓派红外反射传感器
Jan 21 Python
python pygame实现球球大作战
Nov 25 Python
python psutil监控进程实例
Dec 17 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 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判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
原生JS实现天气预报
2020/06/16 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python 26进制计算实现方法
2015/05/28 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
python机器学习实现决策树
2019/11/11 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
中专生毕业自我鉴定
2013/11/01 职场文书
年终晚会主持词
2014/03/25 职场文书
借款协议书范本
2014/04/22 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
上课说话检讨书
2015/01/27 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书