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字符串和字典相关操作的实例详解
Sep 23 Python
python机器学习之神经网络(一)
Dec 20 Python
python排序函数sort()与sorted()的区别
Sep 18 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
python实现扫雷游戏的示例
Oct 20 Python
Python 多进程、多线程效率对比
Nov 19 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
解决python3输入的坑——input()
Dec 05 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 simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
php创建sprite
2014/02/11 PHP
php 使用array函数实现分页
2015/02/13 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
详解django中自定义标签和过滤器
2017/07/03 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python 2.7.14安装图文教程
2018/04/08 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
如何使用Pytorch搭建模型
2020/10/26 Python
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
幼儿教师考核制度
2014/01/25 职场文书
教师个人自我鉴定
2014/02/08 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python