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中from module import * 的一个坑
Jul 20 Python
详解Python中break语句的用法
May 14 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
Python操作串口的方法
Jun 17 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python 常用 PEP8 编码规范详解
Jan 22 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
python中删除某个元素的方法解析
Nov 05 Python
Python实现打印实心和空心菱形
Nov 23 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
selenium+超级鹰实现模拟登录12306
Jan 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP对象实例化单例方法
2017/01/19 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python3实现基于用户的协同过滤
2018/05/31 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
"序列点" 是什么
2016/07/29 面试题
婚纱摄影师求职信范文
2014/04/17 职场文书
三年级评语大全
2014/04/23 职场文书
运动会口号16字
2014/06/07 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
大国崛起日本观后感
2015/06/02 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库