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 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
Python socket编程实例详解
May 27 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python 保存float类型的小数的位数方法
Oct 17 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
Python代码执行时间测量模块timeit用法解析
Jul 01 Python
PyTorch安装与基本使用详解
Aug 31 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
Python import模块的缓存问题解决方案
Jun 02 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php类常量用法实例分析
2015/07/09 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
js停止输出代码
2008/07/20 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
Python实现的石头剪子布代码分享
2014/08/22 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
Unix如何添加新的用户
2014/08/20 面试题
电子专业推荐信范文
2013/11/18 职场文书
QA工程师岗位职责
2013/11/20 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
MySql数据库 查询时间序列间隔
2022/05/11 MySQL