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实现的扫雷游戏实例代码
Aug 01 Python
python中的hashlib和base64加密模块使用实例
Sep 02 Python
python测试驱动开发实例
Oct 08 Python
Python中的rfind()方法使用详解
May 19 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
python实现广度优先搜索过程解析
Oct 19 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
Mar 19 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
pyqt5打包成exe可执行文件的方法
May 14 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
js函数般调用正则
2008/04/08 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
移动节点的jquery代码
2014/01/13 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python类反射机制使用实例解析
2019/12/30 Python
python实现串口通信的示例代码
2020/02/10 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
大学毕业自我评价
2014/02/02 职场文书
五好关工委申报材料
2014/05/31 职场文书
法学自荐信
2014/06/20 职场文书
身份证丢失证明
2015/06/19 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏
golang语言指针操作
2022/04/14 Golang