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 排列组合之itertools
Mar 20 Python
九步学会Python装饰器
May 09 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
Python脚本实现自动将数据库备份到 Dropbox
Feb 06 Python
python rsa 加密解密
Mar 20 Python
Python 装饰器使用详解
Jul 29 Python
Python中turtle作图示例
Nov 15 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
pyCharm 实现关闭代码检查
Jun 09 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
vue cli安装使用less的教程详解
2019/07/12 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python生成随机MAC地址
2015/03/10 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
python面向对象法实现图书管理系统
2019/04/19 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
Python with语句和过程抽取思想
2019/12/23 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
python批量修改文件名的示例
2020/09/27 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
strstr()的简单实现
2013/09/26 面试题
计算机专业自荐信
2013/10/14 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
外科护士长工作总结
2015/08/12 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS