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 UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
Python+django实现简单的文件上传
Aug 17 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
分享一个简单的python读写文件脚本
Nov 25 Python
Django数据库表反向生成实例解析
Feb 06 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
python获取本机所有IP地址的方法
Dec 26 Python
Python图像处理之gif动态图的解析与合成操作详解
Dec 30 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
怎么用Python识别手势数字
Jun 07 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计算页面执行时间的实现代码
2013/06/18 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python 中字典嵌套列表的方法
2018/07/03 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
应届生学校辅导员求职信
2013/11/07 职场文书
医师定期考核实施方案
2014/05/07 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
日语专业求职信
2014/07/04 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
资产运营委托书范本
2014/10/16 职场文书
奖学金个人总结
2015/03/04 职场文书
资金申请报告范文
2015/05/14 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
Mysql开启外网访问
2022/05/15 MySQL