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连接sql server乱码的解决方法
Jan 28 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
Python只用40行代码编写的计算器实例
May 10 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
python中的for循环
Sep 28 Python
python实现银联支付和支付宝支付接入
May 07 Python
安装docker-compose的两种最简方法
Jul 30 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
关于 Python json中load和loads区别
Nov 07 Python
Python学习之时间包使用教程详解
Mar 21 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
文本加密解密
2006/06/23 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
Python threading多线程编程实例
2014/09/18 Python
python提示No module named images的解决方法
2014/09/29 Python
pandas去除重复列的实现方法
2019/01/29 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
详解Python3 pandas.merge用法
2019/09/05 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
请介绍一下Ant
2016/07/22 面试题
高中生评语大全
2014/04/25 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
求职自我评价怎么写
2015/03/09 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android