python调用c++动态链接库,环境是VS2022和vscode2023

目录

  • 前言:
  • 配置环境:
  • 基础夯实(对于ctypes的介绍):
      • 1. 加载共享库
      • 2. 定义函数原型
      • 3. 调用函数
      • 4. 处理数据结构
      • 5. 处理指针
      • 6. 错误处理
      • 7. 使用 `ctypes.util`
      • 总结
  • 效果展示:
  • 操作步骤(保姆级教学)
    • 一在VS中创建dll文件:
      • 首先打开vs
      • 创建新项目
      • 选择c++的空项目
      • 配置新项目
      • 选择新建项
    • 二在VScode中使用python调用dll文件:
      • vscode创建python文件
      • 导入代码:
      • 从终端查看结果
  • 参考资料:

前言:

最近和一位前辈聊天,说到使用python来调用c++动态链接库来解决问题,可以增加产品的性能,所以尝试学习这个技术,后面还会尝试使用c++来调用python库,实现不同语言的交叉使用。欢迎大家交流学习。

配置环境:

在VS中生成c++动态连接库,也就是dll,在vscode中使用python语言进行调用:
在这里插入图片描述
在这里插入图片描述

基础夯实(对于ctypes的介绍):

ctypes 是 Python 的一个外部库,用于调用存储在共享库(如 C 或 C++ 库)中的函数,以及处理 C 数据结构。它提供了一种简单的方式来从 Python 代码中访问 C 代码的功能。下面是一些基本的 ctypes 用法示例:

1. 加载共享库

首先,你需要加载一个共享库(例如 .dll.so.dylib 文件)。ctypes 提供了 CDLLWinDLL 来加载不同平台的库。

  • 对于 Linux/macOS:

    import ctypes
    lib = ctypes.CDLL("/path/to/your/library.so")
    
  • 对于 Windows:

    import ctypes
    lib = ctypes.WinDLL("/path/to/your/library.dll")
    

或者,如果库位于系统的标准库路径中,你可以直接加载库名:

import ctypes
lib = ctypes.CDLL("yourlibrary")

2. 定义函数原型

加载库之后,你需要为将要调用的函数定义原型。这包括函数的返回类型和参数类型。

例如,如果你的 C 库中有一个函数如下:

int add(int a, int b);

你可以在 Python 中这样定义它:

import ctypes# 加载库
lib = ctypes.CDLL("yourlibrary")# 定义函数原型
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]
lib.add.restype = ctypes.c_int

3. 调用函数

定义了函数原型之后,你就可以从 Python 中调用这个函数了:

result = lib.add(2, 3)
print(result)  # 输出: 5

4. 处理数据结构

ctypes 也支持定义和使用 C 风格的数据结构。例如,对于下面的 C 结构体:

struct Point {int x;int y;
};

你可以在 Python 中这样定义:

import ctypesclass Point(ctypes.Structure):_fields_ = [("x", ctypes.c_int),("y", ctypes.c_int)]# 创建实例
point = Point(x=10, y=20)
print(point.x, point.y)  # 输出: 10 20

5. 处理指针

ctypes 同样支持指针操作。例如,要创建一个指向整数的指针:

import ctypesint_pointer = ctypes.pointer(ctypes.c_int(5))
print(int_pointer.contents.value)  # 输出: 5

6. 错误处理

当调用外部函数时,可能会遇到各种错误。ctypes 允许你检查错误码或者捕获异常来处理这些情况。例如,对于 C 库函数返回的错误码,你可以根据需要进行处理。

7. 使用 ctypes.util

ctypes.util 提供了一些实用工具,如 find_library 函数,它可以帮助你查找系统中安装的库:

import ctypes.utillib_name = ctypes.util.find_library("yourlibraryname")
if lib_name:lib = ctypes.CDLL(lib_name)
else:raise ImportError("Library not found")

总结

ctypes 是一个功能强大的工具,它允许你在 Python 中使用 C 代码。通过定义函数原型、处理数据结构和指针,以及进行错误处理,你可以将 Python 的易用性和 C 的性能结合起来。不过,对于复杂的 C++ 代码,ctypes 可能不够直观,此时你可能需要考虑使用 cffiSWIG 或其他工具。

效果展示:

在这里插入图片描述

操作步骤(保姆级教学)

一在VS中创建dll文件:

首先打开vs

在这里插入图片描述

创建新项目

在这里插入图片描述

选择c++的空项目

注意类型不要选错了
在这里插入图片描述

配置新项目

在这里插入图片描述

选择新建项

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码:

#include "pch.h"
#define DLLEXPORT extern "C" __declspec(dllexport) 
//两数相加
DLLEXPORT int sum(int a, int b) {return a + b;
}

如果没有生成成功,看一下是不是dll配置有问题。

二在VScode中使用python调用dll文件:

vscode创建python文件

这个配置文件没什么好说的,直接创建一个文件夹,然后使用vscode打开,创建一个以py结尾的文件即可:
在这里插入图片描述

导入代码:

from ctypes import *
//参考我的路径写法pDll = CDLL("C:\\Users\\wangningning\\source\\repos\\Dll3\\x64\\Debug\\Dll3.dll")
pDll = CDLL("你的dll路径")#调用动态链接库函数
res = pDll.sum(15,20)
#打印返回结果
print(res)

从终端查看结果

在这里插入图片描述
如果结果一样,恭喜你,成功使用python调用了c++动态链接库。

参考资料:

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143581.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

train_llava记录

首先时build_model 【自定义多模态大模型LLaVA——LLaVA系列】 https://www.bilibili.com/video/BV1GS411P74b/?share_sourcecopy_web&vd_source820e17ab3d5412c1c94e68f2e5f07ae7 作者用的4B的qwen1.5 但是这里发现3090是只能部署但是推理爆显存所以只能换成0.5B的 问…

计算机毕业设计汽车选购销售平台管理系统车辆用户分类订单评价购买/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

‌计算机毕业设计:汽车选购销售平台管理系统‌ ‌一、项目概述‌ 本毕业设计项目旨在构建一个全面的汽车选购销售平台管理系统,该系统将涵盖车辆管理、用户分类、订单处理、评价系统以及购买功能。通过采用Spring Boot、JavaWEB、J2EE等后端技术&#…

【java系】记录一次ClassLoader.getResourceAsStream获取不到文件流

问题描述反馈,开发同事在本地获取对应文件流是可以正常业务操作,发布到linux服务器对应环境就会出现异常。 源码部分截图 看到这里,我猜想是否和window底层文件操作系统不区分大小写有关呢?而服务器linux是严格区分大小写这个应该…

黑神话悟空mac可以玩吗

黑神话悟空mac上能不能玩对于苹果玩家来说很重要,那么黑神话悟空mac可以玩吗?目前是玩不了了,没有针对ios系统的版本,只能之后在云平台上找找了,大家可以再观望下看看。 黑神话悟空mac可以玩吗 ‌使用CrossOver‌&…

场外期权或成暴利工具?!应该怎么做场外期权?

今天带你了解场外期权或成暴利工具?!应该怎么做场外期权?通过深入了解市场、选择合适的通道商、制定清晰的策略和有效的风险管理,可以在场外期权交易中取得更好的结果。 什么是场外期权? 场外期权是交易所以外的市场…

【店雷达全网图搜比价盘点】1688、淘宝、阿里国际、亚马逊、速卖通5大平台

全网图搜比价的意义,对于商家来说的意义在于可以对比不同供应商提供的同款或类似产品的价格,找出性价比高且质量可靠的商品,确保在运费和其他成本考虑下仍能保持合理利润空间,挑选出更具性价比且可靠的商品有效降低选品风险。 店…

ubuntu安装wordpress(基于LNMP环境)

参考链接 Ubuntu安装LNMP 安装步骤 环境需要LNMP环境,如果没有安装可以参考ZATA—LNMP简单安装 在mysql中设置wordpress所用的用户名和密码 #1. 登录mysql mysql -uroot -p #2. 创建wordpress数据库 create database wordpress; #3. 创建新用户user,…

ES分词导致查询结果不准确

问题现象 索引里面有数据,而没有查询出来。 如下图所示,术语库(索引)中里面有一条数据的原文是“层”,而根据完整的原文来查询该原文中的术语,并未将该术语查询出来。 根据原文查询该原文中的术语&#x…

飞睿智能UWB BLE Tag蓝牙防丢器模块,APP测距定位一键绑定,安全守护每一刻

我们总在不经意间与生活中的小物件擦肩而过——钥匙遗忘在咖啡厅的角落,钱包遗失在拥挤的地铁,甚至孩子的书包在人群中悄然消失……每一次的失而复得都是幸运的眷顾,但更多的是遗憾与不便。今天,就让我带你走进一个智能守护的新世…

如何在多台Linux虚拟机上安装和配置Kafka集群

Kafka是一个高性能、分布式的流处理平台,被广泛应用于大规模实时数据处理场景。它具有高吞吐量、低延迟和可水平扩展等特点,能够有效地处理海量数据流。为了提高Kafka的可用性和容错性,通常会在多个节点上部署Kafka集群。在这个指南中&#x…

银行监管报送系统系列介绍(二十):资产减值准备规则变迁与报送要求

资产减值准备是商业银行识别和防范信用风险的重要工具。自2002年人民银行发布《贷款损失准备计提指引》以来,我国对于减值准备的计提与考察规则逐步完善。目前许多监管模块都要求统计各类业务的减值准备,不同报表的统计口径和粒度也不尽相同。因此我们综述了填报说明中依据的…

react + antDesignPro 企业微信扫码登录

效果 实现步骤 1、项目中document.ejs文件引入企微js链接 注意&#xff1a;技术栈是使用的react antDesignPro&#xff0c;不同的技术栈有不同的入口文件&#xff08;如vue在html文件引入&#xff09; <script src"https://wwcdn.weixin.qq.com/node/wework/wwopen/j…

Maximum call depth exceeded 【解决】

Maximum call depth exceeded 【解决】 在前端开发中&#xff0c;Maximum call depth exceeded 是一个常见的错误信息&#xff0c;它通常与递归调用深度过深有关。当 JavaScript 引擎执行递归函数时&#xff0c;如果递归层次过多&#xff0c;会超出调用栈的最大深度&#xff0c…

离散制造 vs 流程制造:锚定精准制造未来,从装配线到化学反应,实时数据集成在制造业案例中的多维应用

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量替代 OGG, Kettle 等同步工具&#xff0c;以及基于 Kafka 的 ETL 解决方案&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业…

了解变压器电压调节抽头

提供给变压器初级的电压可能与标称值不同。大多数公用事业公司将提供标称额定值 5% 以内的电压&#xff1b;但是&#xff0c;设施内的电压下降可能会导致提供给变压器的实际电压低于标称值 5% 以上。公用事业供应也可能有所不同。向变压器初级提供与额定初级电压不同的电压会导…

从零手写大模型,零基础入门到精通,收藏这一篇就够了

这里为从零手写大模型的实战课程介绍。 1、课程定位 如果你想成为真正懂 AI、可以写代码进行 AI 模型开发、对大模型的底层技术很了解的技术性人才&#xff0c;就来这里从零学习手写大模型吧。 本课程适合以下的同学&#xff1a; 1、希望从事AI 算法开发、大模型开发的同学…

基于yolov8的红外小目标无人机飞鸟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的红外小目标无人机与飞鸟检测系统是一项集成了前沿技术的创新解决方案。该系统利用YOLOv8深度学习模型的强大目标检测能力&#xff0c;结合红外成像技术&#xff0c;实现了对小型无人机和飞鸟等低空飞行目标的快速、准确检测。 YOLOv8作为YOLO系列的…

提升自闭症教育:探索寄宿学校的创新实践

在特殊教育领域中&#xff0c;自闭症儿童的教育与康复一直是一个复杂而重要的课题。随着教育理念的进步和康复技术的不断发展&#xff0c;越来越多的创新实践被应用于自闭症儿童的教育中。其中&#xff0c;广州的星贝育园自闭症儿童寄宿制学校以其独特的教育模式和全方位的康复…

(已解决)vscode如何传入argparse参数来调试/运行python程序

文章目录 前言调试传入参数运行传入参数延申 前言 以前&#xff0c;我都是用Pycharm专业版的&#xff0c;由于其好像在外网的时候&#xff0c;不能够通过VPN来连接内网服务器&#xff0c;我就改用了vscode。改用了之后&#xff0c;遇到一个问题&#xff0c;调试或者运行python…

低代码门户技术:构建高效应用的全新方式

什么是低代码门户技术&#xff1f; 低代码门户技术是一种利用低代码平台构建企业门户网站或应用的技术。门户通常是企业内部和外部用户访问信息和应用的集中平台。低代码门户技术通过图形化界面和预置组件&#xff0c;允许用户快速搭建和定制这些门户平台&#xff0c;而无需深…