Python中使用ctypes调用C++的方法
作者:星光2020 发布时间:2021-09-28 10:36:13
标签:Python,ctypes,C++
在Python中可以通过几种方法调用C++的函数,这里介绍使用ctypes的方法。ctypes是Python自带的一个模块,能够直接载入C++生成的动态链接库,并调用其中的函数。示例如下
代码文件:add.cpp
int add(int a, int b) {
return a+b;
}
头文件:add.h
extern "C"
int add(int a, int b);
编译命令
$ g++ -fPIC -shared -o add.so add.cpp
在Ubuntu系统通过上述编译命令生成动态链接库add.so。其中需要输出的函数必须定义为extern "C"类型,表示函数接口以C语言的格式输出。
在Python中的调用方法如下
from ctypes import *
lib = cdll.LoadLibrary('./add.so')
a = 5
b = 4
c = lib.add(a,b)
print("a + b = ", c)
这是比较简单的例子,对于使用numpy等数据类型的函数则需要更为复杂的形式,比如对于两个数组相加的例子
代码文件:add_arr.cpp
void add_arr(double a[10][10], double b[10][10], double c[10][10]) {
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
}
头文件:add_arr.h
extern "C"
void add_arr(double a[10][10], double b[10][10], double c[10][10]);
实现一个简单的数组相加的功能
在Python文件中调用的方法
from ctypes import *
def double_ptr(arr):
ptr = arr.ctypes.data_as(POINTER(c_double))
return ptr
lib = cdll.LoadLibrary('./add_arr.so')
lib_add_arr = lib.add_arr
lib_add_arr.argtypes = [ #指定函数调用的参数形式
POINTER(c_double), #ctypes定义下的指向64位浮点数的指针
POINTER(c_double),
POINTER(c_double) ]
a = np.random.rand(10,10)
b = np.random.rand(10,10)
c = np.zeros([10,10])
#调用函数,执行数据的相加
lib_add_arr(double_ptr(a), double_ptr(b), double_ptr(c))
print("a = \n", a)
print("b = \n", b)
print("c = \n", c)
在Python程序中,首先指定调用函数的参数形式,通过ctypes库可以把numpy数组以数据指针的形式传递给C++函数,在调用函数的时候,分别把numpy数组的指针传递给函数,即可以在C++函数中实现对两个数组的相加。然后打印数据和运算结果。
其中double_ptr是一个把numpy数组转为指针的操作符。
来源:https://blog.csdn.net/mbdong/article/details/130976755


猜你喜欢
- 在数据分析中经常需要从csv格式的文件中存取数据以及将数据写书到csv文件中。将csv文件中的数据直接读取为 dict 类型和 DataFr
- 1.聚合运算(1)使用内置的聚合运算函数进行计算1>内置的聚合运算函数sum(),mean(),max(),min(),size(),
- 请看下面的操作图解。1.使用Sql Server Management Studio 2008 连接数据库。2.选中要导出数据的数据库节点,
- 比如说在1-3000之内生成随机永不重复数,点击运行代码的时候请注意,此代码比较占用资源,如果硬件配置比较菜请把count改小。俺的电脑配置
- 方法说明: 同步版的 stat() 。方法返回一个stat数组对象,包含以下信息:(以下信息为案例中读取的文件信息,非默认值){
- 前言:Druid 连接池是阿里巴巴开源的数据库连接池项目,Druid 为监控而生,内置强大的监控功能,监控特性不影响性能,官网地址为:htt
- 什么是爬虫?网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息
- 主要代码如下: total = application("All
- 问题最近在使用 Vue 做东西,用到钉钉扫描登录的功能,这里需要引入远程的 js 文件,因为 Vue 的方式跟之前的不太一样,又不想把文件下
- class test { &nbs
- 来看一个实例:<!DOCTYPE html><html lang="en"><head&g
- 由 John Resig 的 How JavaScript Timers Work 可以知道,现有的 JavaScript 引擎是单线程处理
- 禁止鼠标右键:$(document).ready(function(){ $(document).bind("contextmen
- 学习了css一段时间,现在对css的一些技巧进行一次小结.希望能对那些刚学习css的新手们带来帮助.一、关于注释在创建xhtml+CSS网站
- 这个方法返回其参数商数的反正切。该ATAN2方法返回-pi和PI 较(x,y)点的角度theta之间的数值。语法Math.ata
- 前言故事要从上面这张表情包开始讲起,看到这张表情包之后,我突发奇想,觉得可以将室友上班摸鱼的照片拼接起来,做成表情包叫他起床 激励他学习!!
- 本文实例为大家分享了python批量文件重命名的具体代码,供大家参考,具体内容如下问题描述最近遇到朋友求助,如何将大量文件名前面的某些字符删
- 今天在使用MySQL时却不知如何处理,插入记录后不知怎样获得刚刚插入的id,查过文档后发现了select last_insert_id(),
- 安装并导入模块打开命令行窗口,输入:pip install -i https://mirrors.aliyun.com/pypi/simpl
- 说明1、模型集成是指将一系列不同模型的预测结果集成在一起,从而获得更好的预测结果。2、对于模型集成来说,模型的多样性非常重要。Diversi