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实现以时间换空间的缓存替换算法
Feb 19 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
Python 的类、继承和多态详解
Jul 16 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
Python3+Appium安装使用教程
Jul 05 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Pytorch mask_select 函数的用法详解
Feb 18 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 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数据库抽象层 PDO
2011/05/07 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
python 二维数组90度旋转的方法
2019/01/28 Python
python操作kafka实践的示例代码
2019/06/19 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
护理专业个人求职简历的自我评价
2013/10/13 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
人事专员的职责
2014/02/26 职场文书
科学发展观演讲稿
2014/09/11 职场文书
竞选学委演讲稿
2014/09/13 职场文书
大学生赌博检讨书
2014/09/22 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
毕业论文致谢词
2015/05/14 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS