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文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
python抖音表白程序源代码
Apr 07 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 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获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
python监控键盘输入实例代码
2018/02/09 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
python实现自主查询实时天气
2018/06/22 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
详解Python中的Lock和Rlock
2021/01/26 Python
python实现控制台输出颜色
2021/03/02 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
幼儿园实习生辞职信
2014/01/20 职场文书
土建施工员岗位职责
2014/07/16 职场文书
装配出错检讨书
2014/09/23 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
匿名检举信范文
2015/03/02 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis