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函数,实现不同语言的交叉使用。欢迎大家交流学习。c++来调用python函数已出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.rhkb.cn/news/431453.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8——测量高速公路上汽车的速度

引言 在人工神经网络和计算机视觉领域,目标识别和跟踪是非常重要的技术,它们可以应用于无数的项目中,其中许多可能不是很明显,比如使用这些算法来测量距离或对象的速度。 测量汽车速度基本步骤如下: 视频采集&#x…

(done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)

来源:https://www.youtube.com/watch?vdaB9naGBVv4 模拟信号特点如下 时域连续(x轴) 振幅连续(y轴) 如下是模拟信号的一个例子: 数字信号特点如下: 一个离散值序列 数据点的值域是一系列有限的值 ADC:模拟信号到数字信号的…

python全栈学习记录(十八)re、os和sys、subprocess

re、os和sys、subprocess 文章目录 re、os和sys、subprocess一、re1.正则字符2.正则表达式的使用3.group的使用4.贪婪匹配与惰性匹配5.其他注意事项 二、os和sys1.os2.sys 三、subprocess四、打印进度条 一、re python中的re模块用来使用正则表达式,正则就是用一系…

【Python机器学习】NLP信息提取——提取人物/事物关系

目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该…

http增删改查四种请求方式操纵数据库

注意:在manage.py项目入口文件中的路由配置里,返回响应的 return语句后面的代码不会执行,所以路由配置中每个模块代码要想都执行,不能出现return 激活虚拟环境:venv(我的虚拟环境名称)\Scripts\activate …

java项目发布后到Tomcat时,总是带一层路径解决方案

java项目发布后到Tomcat时,总是带一层路径 参考文章:java 线上项目访问项目 会多一层项目根路径 根据参考文章写的这篇文章,部分文章细节有完善和改动 在Java Web应用中,当你把应用发布到Tomcat时,如果应用的web.xml配置文件中的&…

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要:本次升级支持联邦应用跨集群滚动升级,使用户版本发布流程更加灵活可控;透明同事karmadactl 新增了多项运维能力,提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布!新增应用跨集群滚动升…

柔性数组 初学版

1.定义 结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员 有些编译器会报错⽆法编译可以改成: typedef struct st_type { int i; int a[]; // 柔性数组成员 }type_a; 2.柔性数组的特点: • 结构中的柔性数组成员前…

ReadWriteLock读写锁

读写锁基本概念 ReadWriteLock是Java并发包中的一个接口,它定义了两种锁:读锁(Read Lock)和写锁(Write Lock),真正的实现类是ReentrantReadWriteLock。读锁允许多个线程同时读取共享资源&#…

JAVA开源项目 体育馆管理系统 计算机毕业设计

本文项目编号 T 048 ,文末自助获取源码 \color{red}{T048,文末自助获取源码} T048,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

记一次Mac 匪夷所思终端常用网络命令恢复记录

一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问&#xff0c;&#xff0c;&#xff0c;&#xff0c; 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…

美业门店怎么提升业绩?连锁美业门店管理系统收银系统拓客系统源码

美业门店想要提升业绩&#xff0c;需要考虑多方面的因素&#xff0c;并采取综合性的方法。以下是一些可以考虑的因素和建议&#xff1a; 产品与服务优化&#xff1a; 提供高质量的美容产品和服务&#xff0c;确保顾客满意度。不断更新产品线&#xff0c;引入新的时尚趋势&#…

pycharm 使用 translation 插件通过openai进行翻译

pycharm 使用 translation 插件通过openai进行翻译 1. 安装插件2. 配置插件3. 翻译 1. 安装插件 2. 配置插件 3. 翻译 调用 openai 时使用的提示词如下&#xff1a; <|im_start|>system\nYou are a translation engine that can only translate text and cannot interpr…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据&#xff0c;在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中&#xff0c;我们介绍了大模型的数据处理链路&#xff0c;本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

第18届全国热管会议举办,积鼎科技分享「环路热管相变传热仿真」前沿实践

第18届全国热管会议于9月20日至22日在海滨城市日照举行&#xff0c;该会议由中国工程热物理学会热管专业组主办&#xff0c;山东大学和日照市科学技术协会联合承办&#xff0c;汇聚了全国热管技术领域的专家学者及企业代表。在该会议上&#xff0c;积鼎科技在热管仿真方面的成果…

移动剧院:流动艺术空间的声学革命—轻空间

在当今多元化的文化环境中&#xff0c;移动剧院作为一种新兴的演出形式&#xff0c;正在迅速崛起。它不仅提供了灵活多变的演出场地&#xff0c;更以其卓越的声学性能&#xff0c;为观众带来了沉浸式的视听体验。移动剧院的声学优势&#xff0c;使其成为各种艺术活动的理想选择…

TomCat乱码问题

TomCat控制台乱码问题 乱码问题解决&#xff1a; 响应乱码问题 向客户端响应数据&#xff1a; package Servlet;import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servl…

C++中的IO流

1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲…

DELPHI编译软件时带上当前IDE的版本号

如果通过 CompilerVersion 得到的也只是编译器的版本号。 比如&#xff1a;delphi XE12 是 36 &#xff0c;也仅此而己。 我想得到的是IDE的版本号&#xff0c;比如当前最新版本的DELPHI是&#xff1a;Embarcadero RAD Studio 12 Version 29.0.53571.9782 我想得到 29.0.53…

轰!天文学家刚刚目睹了三年来最大的太空爆炸

天文学家目睹了太空中最大的一次爆炸。 被标记为 AT2021lwx 的这次爆炸事件被观测到比任何已知的超新星都要亮十倍&#xff0c;超新星爆炸发生在大质量恒星死亡之时。而且超新星爆炸只持续几个月&#xff0c;而这次爆炸事件已经持续了至少三年。 AT2021lwx 也比恒星被超大质量…