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中二维阵列的变换实例
Oct 09 Python
python查找指定具有相同内容文件的方法
Jun 28 Python
python实现的系统实用log类实例
Jun 30 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
python模块之time模块(实例讲解)
Sep 13 Python
深入理解Python中range和xrange的区别
Nov 26 Python
python numpy和list查询其中某个数的个数及定位方法
Jun 27 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Opencv 图片的OCR识别的实战示例
Mar 02 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
初学Python实用技巧两则
2014/08/29 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
使用python实现名片管理系统
2020/06/18 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
暑期实习鉴定
2013/12/16 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
新农村建设标语
2014/06/24 职场文书
师德师风自查总结
2014/10/14 职场文书
2014年防汛工作总结
2014/12/08 职场文书
灵山大佛导游词
2015/02/04 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
MySQL 自定义变量的概念及特点
2021/05/13 MySQL