Python使用ctypes调用C/C++的方法


Posted in Python onJanuary 29, 2019

python使用ctypes调用C/C++

1. ctpes介绍

ctypes is a foreign function library for Python. It provides C compatible data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python.

官方文档地址: https://docs.python.org/3/library/ctypes.html

2.使用ctypes调用C语言

python对于标准C的兼容做的相当不错,调用起来相对比较简单,下面给大家上案例

1. 创建一个adder.c文件,代码如下:

#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编写的连个函数,用来计算两个整数相加和两个单精度浮点数相加

2. 编译生成.so文件供python程序调用

在linux环境下使用gcc对adder.c进行编译

命令: gcc adder.c -fPIC -shared -o adder.so

3.在python程序中调用.so

创建一个python文件,命令为adder.py,代码如下:

from ctypes import *
adder = CDLL("./adder.so")
res_int = adder.add_int(4,5)
print("result: " + str(res_int))

然后在终端里执行命令: python adder.py

执行命令之后就能获得到输出了。

3. 使用ctypes调用C++

与调用C语言不通,在调用C++代码时,需要在源文件中增加一个extern "C"的代码块

1.创建一个adder_plus.cpp文件,代码如下:

#include <stdio.h>
#include <iostream>
using namespace std;
int add_integer(int a , int b);
float add_float(float a, float b);
int add_integer(int a , int b){
  return a + b;
}
float add_float(float a, float b){
  return a + b;
}
extern "C"{
  int add_integer_plus(int a , int b){
    return add_integer(a, b);
  }
  float add_float_plus(float a, float b){
    return add_float(a ,b);
  }
}

extern "C"里的代码是暴露给的python的接口,可以使用CDLL进行调用

2. 编译生成.so文件供python程序调用

在linux环境下使用gcc对adder.c进行编译

命令: gcc adder_plus.cpp -fPIC -shared -o adder_plus.so

3. 在python文件中调用.so

创建一个python文件,命名为adder_plus.py,代码如下:

from ctypes import *
add_plus = CDLL('./add_pluse.so')
sum = add_plus.add_integer_plus(4,5)
print("sum: " + str(sum))
# 使用float类型变量作为函数参数
a = c_float(5.5)
b = c_float(4.1)
add_float = add_plus.add_float_plus
add_float.restype = c_float
sum_float = add_plus.add_float_plus(a,b)
print(sum_float)

然后在终端里执行命令: python adder_plus.py

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python持久性管理pickle模块详细介绍
Feb 18 Python
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
Python3学习urllib的使用方法示例
Nov 29 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
python用插值法绘制平滑曲线
Feb 19 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
Python中如何处理常见报错
Jan 18 Python
dataframe 按条件替换某一列中的值方法
Jan 29 #Python
Numpy之random函数使用学习
Jan 29 #Python
pandas DataFrame 删除重复的行的实现方法
Jan 29 #Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 #Python
Python Pexpect库的简单使用方法
Jan 29 #Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 #Python
对python numpy.array插入一行或一列的方法详解
Jan 29 #Python
You might like
PHP添加MySQL数据记录代码
2008/06/07 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
Python中asyncore的用法实例
2014/09/29 Python
python黑魔法之编码转换
2016/01/25 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
合作意向协议书范本
2014/03/31 职场文书
授权委托书
2014/09/17 职场文书
幼儿教师辞职信
2015/02/27 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL