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中for循环控制语句用法实例
Jun 02 Python
python中常用的九种预处理方法分享
Sep 11 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
Python 求向量的余弦值操作
Mar 04 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 中的输出缓冲
2006/12/21 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
如何实现JS函数的重载
2006/09/22 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
Python 数据结构之旋转链表
2017/02/25 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Django nginx配置实现过程详解
2020/09/10 Python
彻底解决Python包下载慢问题
2020/11/15 Python
python SOCKET编程基础入门
2021/02/27 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
事业单位公务员的职业生涯规划
2014/01/15 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
2014年领班工作总结
2014/11/25 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
道士塔读书笔记
2015/06/30 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
MySQL中日期型单行函数代码详解
2021/06/21 MySQL