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中的__new__()方法的使用
Apr 09 Python
Python队列的定义与使用方法示例
Jun 24 Python
itchat接口使用示例
Oct 23 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
pandas object格式转float64格式的方法
Apr 10 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
详解Python3 pickle模块用法
Sep 16 Python
python 实现list或string按指定分段
Dec 25 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
python中判断文件结束符的具体方法
Aug 04 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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 获取一个月第一天与最后一天的代码
2010/05/16 PHP
11个PHP 分页脚本推荐
2011/08/15 PHP
php实现文件编码批量转换
2014/03/10 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
php xhprof使用实例详解
2019/04/15 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
js表格分页实现代码
2009/09/18 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
HTML的select控件美化
2017/03/27 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
新春文艺演出主持词
2014/03/27 职场文书
军训口号
2014/06/13 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
2014年科室工作总结
2014/11/20 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
农业项目合作意向书
2015/05/08 职场文书