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通过zlib实现压缩与解压字符串的方法
Nov 19 Python
python链接Oracle数据库的方法
Jun 28 Python
python算法演练_One Rule 算法(详解)
May 17 Python
python负载均衡的简单实现方法
Feb 04 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
python flask框架实现重定向功能示例
Jul 02 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
详解Python中*args和**kwargs的使用
Apr 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学习 字符串课件
2008/06/15 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
2018/09/14 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
python爬虫爬取某站上海租房图片
2018/02/04 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
公司培训欢迎词
2014/01/10 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
护理专业自我评价
2015/03/11 职场文书
卫生主题班会
2015/08/14 职场文书
运动会广播稿50字
2015/08/19 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python