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编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
python 筛选数据集中列中value长度大于20的数据集方法
Jun 14 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
Django 静态文件配置过程详解
Jul 23 Python
Python环境下安装PyGame和PyOpenGL的方法
Mar 25 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
python文件读取失败怎么处理
Jun 23 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
Python-openCV开运算实例
Jul 05 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
js格式化时间的方法
2015/12/18 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
web.py中调用文件夹内模板的方法
2014/08/26 Python
Python ftp上传文件
2016/02/13 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python中交换两个元素的实现方法
2018/06/29 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python中封包建立过程实例
2021/02/18 Python
电子商务专员岗位职责
2013/12/11 职场文书
银行领导证婚词
2014/01/11 职场文书
大学生学习自我评价
2014/01/13 职场文书
询价采购方案
2014/06/09 职场文书
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
Elasticsearch 批量操作
2022/04/19 Python
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js