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开发之thread实现布朗运动的方法
Nov 11 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
python 处理string到hex脚本的方法
Oct 26 Python
python使用PyQt5的简单方法
Feb 27 Python
python使用递归的方式建立二叉树
Jul 03 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
python中p-value的实现方式
Dec 16 Python
python构造函数init实例方法解析
Jan 19 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python打印不合法的文件名
Jul 31 Python
用python发送微信消息
Dec 21 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
javascript生成大小写字母
2015/07/03 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
python读写csv文件的方法
2019/08/13 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
Notino法国:购买香水和化妆品
2019/04/15 全球购物
公司财务自我评价分享
2013/12/17 职场文书
电大本科自我鉴定
2014/02/05 职场文书
校运会口号
2014/06/18 职场文书
暑期社会实践证明书
2014/11/17 职场文书
升学宴来宾致辞
2015/07/27 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
nginx之内存池的实现
2022/06/28 Servers