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
0
投稿
猜你喜欢
- 本文实例为大家分享了python实现简易学生信息管理系统的具体代码,供大家参考,具体内容如下一、系统功能1.录入学生信息2.查找学生信息3.
- 废话少说,直接上代码:<?php/** * Note:for octet-stream upload * 这个是流式上传PHP文件 *
- 元素浮动导致的问题及解决办法大家都应该很熟悉了,举个简单的例子:<style type="text/css">
- 地址:https://youzan.github.io/vant/#/zh-CN/intro一.引入Vant组件库1.首先运行 npm in
- 转自微信公众号: Python之禅1.日志简介说到日志,无论是写框架代码还是业务代码,都离不开日志的记录,他能给我们定位问题带来极
- 你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器。几天
- 性能首先,FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入FCKEDITOR所需文件.对于其他在线编辑器来说,这几乎是个很难
- 只需要在fckeditor\editor\filemanager\connectors\asp文件夹下的commands.asp修改一下即可
- 本文主要研究的是selenium python浏览器多窗口处理的相关内容,分享了操作实例代码,具体如下:#!/usr/bin/python#
- 前言在《Python中if语句的使用方法》中提到,对于一种可能性、两种可能性或者多种可能性的情况,可以通过if语句来实现。而用if语句实现多
- 原因我们在安装第三方库时,通常使用pip或pycharm的图形界面(右下角Python版本 -> 解释器设置 -> 加号)安装在
- 有时候要通过asp代码在数据库中创建表和列,下面的就是这些操作的函数。1.检测表是否存在tbName 检测的表的名称dbTp 数据库的类型1
- 所谓“评论”不是必须得有文本框,用户录入提交数据才算,广义上的评论包括用户的任何“表态”,典型如打分。我接触电子商务时间并不长,最早应该是0
- 一、logging模块Python中有一个模块logging,可以直接记录日志# 日志级别# CRITICAL 50# ERRO
- 感谢 Dawn CSS Reset 的尝试和建议。针对字体的写法,觉得需要说明一下:body,button, input, select,
- 有时候用phpMyAdmin的时候会突然出现这个错误信息 “无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP
- 传统来说,大家在CSS中使用的颜色要么是16进制格式,要么是rgb格式,就像rgb(171,205,239)。CSS3带来了一些新的处理颜色
- 一、临时表空间概念临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当
- 有时需要获取远程网站的某些信息,而服务器又限制了GET方式,只能通过POST数据提交,这个时候我们可以通过asp来实现模拟提交post数据,
- 继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重