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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
python中列表和元组的区别
Dec 18 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
Python实现自动装机功能案例分析
Oct 22 Python
python自动生成sql语句的脚本
Feb 24 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 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
php 设计模式之 单例模式
2008/12/19 PHP
php检测useragent版本示例
2014/03/24 PHP
php输出xml属性的方法
2015/03/19 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
php阳历转农历优化版
2016/08/08 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python语音识别实践之百度语音API
2018/08/30 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
python使用requests.session模拟登录
2019/08/09 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
软件测试题目
2013/02/27 面试题
妇产科护士自我鉴定
2013/10/15 职场文书
好听的队名和口号
2014/06/09 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
Redis命令处理过程源码解析
2022/02/12 Redis
使用python绘制横竖条形图
2022/04/21 Python