当前位置: 首页 > article >正文

(4)python开发经验

文章目录

      • 1 使用ctypes库调用
      • 2 使用pybind11


更多精彩内容
👉内容导航 👈
👉Qt开发 👈
👉python开发 👈

1 使用ctypes库调用

  • 说明:ctypes是一个Python内置的库,可以提供C兼容的数据类型,并允许调用动态链接库中的函数。它允许Python直接与C的共享库(.dll文件在Windows系统中,.so文件在Linux系统中)进行交互。
  • 优点:
    • 不需要编译Python扩展模块,使用简单。
    • 可以直接加载和调用C++编写的函数。
  • 缺点:
    • 性能上不如专门设计的Python-C++绑定。
    • 对C++代码的复杂性支持有限,仅适用于简单的函数调用。
    • 需要手动处理数据类型转换,容易出错。
环境说明
系统windows11
编译器msvc2017
python3

c++代码

  • test.h

    #ifndef TEST_H
    #define TEST_Hextern "C"  // 这里是关键,声明C接口,防止C++编译器对函数名进行修饰
    { // 导出函数声明,如果是gcc、mingw编译器则去掉 __declspec(dllexport)__declspec(dllexport) int add(int a, int b); 
    }    
    #endif /* TEST_H */
    
  • test.cpp

    #include "test.h"int add(int a, int b)
    {return a + b;
    }
    
  • CMakeLists.txt

    cmake_minimum_required(VERSION 3.15)project(test)set(SOURCE test.htest.cpp)add_library(${PROJECT_NAME} SHARED ${SOURCE}) # 设置为动态库
    
  • 编译后会生成test.lib、test.dll两个文件;

  • 如果使用mingw编译器编译会生成libtest.dll.a、libtest.dll两个文件,使用libtest.dll。

python调用dll

  • 将test.dll文件放到main.py所在路径下。

  • main.py

    from ctypes import cdlllib = cdll.LoadLibrary('./test.dll')
    # 判断是否加载成功
    if lib:print("加载成功")
    else:print("加载失败")# 调用简单函数
    result = lib.add(3, 5)
    print(result)  # 输出8
    

注意: __declspec(dllexport) 是MSVC编译器特有的关键词,用于Windows平台的DLL导出。如果你使用的是GCC编译器(通常在Linux或macOS上使用),则不需要使用 __declspec(dllexport)

2 使用pybind11

pybind11 是一个用于方便地将 C++ 代码绑定到 Python 的库,它使得在 Python 中调用 C++ 函数、使用 C++ 类和数据结构变得简单。以下是 pybind11 的一些优点和缺点:

优点:

  1. 简单易用:pybind11 的语法简洁,易于上手。它提供了一种直观的方式将 C++ 代码暴露给 Python,这样即使是没有太多经验的用户也能够快速地编写绑定代码。
  2. 高性能:由于 pybind11 直接将 C++ 的类型映射到 Python 的类型,它可以提供接近于直接调用 C++ 函数的性能。
  3. 良好的 ABI 支持:pybind11 可以很好地处理 Python 的 ABI(Application Binary Interface),这意味着它在不同的 Python 版本之间具有很好的兼容性。
  4. 支持复杂的 C++ 特性:除了基本的数据类型之外,pybind11 还支持复杂的 C++ 特性,如 STL 容器、智能指针、异常处理等。
  5. 自动类型转换:pybind11 提供了自动的类型转换机制,使得在 C++ 和 Python 之间传递数据变得更加容易。

缺点:

  1. 学习曲线:虽然 pybind11 的语法简单,但要充分利用它的功能,还需要对 C++ 和 Python 的一些底层机制有一定的了解,这可能会形成一定的学习曲线。
  2. 调试复杂:当绑定的 C++ 代码出现问题时,调试可能会变得复杂,因为错误信息可能只出现在 Python 端,而实际的错误可能在 C++ 代码中。
  3. 跨平台一致性:虽然 pybind11 旨在提供跨平台的一致性,但在某些特殊情况下,可能仍然会遇到平台相关的兼容性问题。
  4. 依赖于 CMake:pybind11 建议使用 CMake 来构建项目,这对于那些不熟悉 CMake 的开发者来说可能会增加一些额外的负担。
  5. 编译时间:对于大型项目,编译时间可能会比较长,这取决于项目的复杂度和规模。
环境说明
系统windows11
编译器msvc2017-64
注意:如果使用mingw编译则python可能无法使用,python一般是使用msvc生成
  • 使用git clone https://github.com/pybind/pybind11.git下载源码;

  • 将pybind11文件夹放到C++工程路径下;

    在这里插入图片描述

  • test.cpp

    #include <pybind11/pybind11.h>int add(int a, int b) {return a + b;
    }namespace py = pybind11; // 这里的命名空间别名是 pyPYBIND11_MODULE(test, m) {// def用法:def(name, function, doc_string)// name: 在Python中调用的函数名// function: 要绑定的C++函数// doc_string: 函数的文档字符串m.def("add", &add, "A function which adds two numbers");
    }
  • CMakeLists.txt

    cmake_minimum_required(VERSION 3.15)project(test)add_subdirectory(./pybind11) # 这里是添加pybind11的子目录set(SOURCE test.cpp)pybind11_add_module(${PROJECT_NAME} ${SOURCE}) # 使用pybind11_add_module函数生成模块
  • 编译后会生成一个test.cp313-win_amd64.pyd文件,将test.cp313-win_amd64.pyd放到main.py路径下。

  • main.py

    import testprint(test.add(2,3))
    
  • 或者使用pip install pybind11安装库;

  • CMakeLists.txt如下所示:

    cmake_minimum_required(VERSION 3.15)project(test)# 寻找python库,Interpreter:表示查找 Python 解释器,Development:表示查找 Python 开发包
    find_package(Python COMPONENTS Interpreter Development) 
    # 查找pybind11包,并设置路径
    find_package(pybind11 PATHS "E:/py/PythonProject1/.venv/Lib/site-packages/pybind11/share/cmake/" REQUIRED) set(SOURCE test.cpp)pybind11_add_module(${PROJECT_NAME} ${SOURCE}) # 使用pybind11_add_module函数生成模块


相关文章:

(4)python开发经验

文章目录 1 使用ctypes库调用2 使用pybind11 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 使用ctypes库调用 说明&#xff1a;ctypes是一个Python内置的库&#xff0c;可以提供C兼容的数据类型…...

深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察

深度剖析 GpuGeek 实例&#xff1a;GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察 前言 GpuGeek专注于人工智能与高性能计算领域的云计算平台&#xff0c;致力于为开发者、科研机构及企业提供灵活、高效、低成本的GPU算力资源。平台通过整合全球分布式数据中心资源&#…...

MindSpore框架学习项目-ResNet药物分类-数据增强

目录 1.数据增强 1.1设置运行环境 1.1.1数据预处理 数据预处理代码解析 1.1.2数据集划分 数据集划分代码说明 1.2数据增强 1.2.1创建带标签的可迭代对象 1.2.2数据预处理与格式化&#xff08;ms的data格式&#xff09; 从原始图像数据到 MindSpore 可训练 / 评估的数…...

e.g. ‘django.db.models.BigAutoField‘.

在Django框架中&#xff0c;django.db.models.BigAutoField 是一个用于数据库模型的字段类型&#xff0c;它用于自动增长的ID字段。这个字段类型特别适用于需要处理大量数据的应用&#xff0c;比如在大型网站或应用中&#xff0c;普通的 AutoField 可能不足以存储增长的ID值&am…...

ACM算法

在ACM模式下使用JavaScript/TypeScript获取输入值 在ACM编程竞赛或在线判题系统(如LeetCode、牛客网等)中&#xff0c;JavaScript/TypeScript需要特定的方式来获取输入值。以下是几种常见的获取输入的方法&#xff1a; 1. 使用Node.js的readline模块 这是最常见的处理ACM模式…...

MySQL入门指南:环境搭建与服务管理全流程

引言 各位开发者朋友们好&#xff01;今天我们将开启MySQL的学习之旅 &#x1f31f; 作为世界上最流行的开源关系型数据库&#xff0c;MySQL在Web应用、企业系统等领域占据着举足轻重的地位。无论你是刚入行的新手&#xff0c;还是想系统复习的老鸟&#xff0c;这篇教程都将为…...

【MySQL】别名设置与使用

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 别名基础概念2. 列别名设置2.1 基础语法2.2 特殊字符处理2.3 计算字段示例 3. 表别名应用3.1 基础表别名3.2 自连接场景 4. 高级别名技术4.1 子查询别名4.2 CTE别名 5. 别名执行规则5.1 作用域限制5.2 错误用…...

【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权

【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权 文章目录 【内网渗透】——S4u2扩展协议提权以及KDC欺骗提权[toc]一&#xff1a;Kerberos 委派攻击原理之 S4U2利用1.1原理1.2两种扩展协议**S4U2Self (Service for User to Self)****S4U2Proxy (Service for User to Proxy)*…...

枢轴支压点策略

一种基于枢轴点&#xff08;Pivot Point&#xff09;的交易策略&#xff0c;主要用于在趋势行情中进行交易。 策略的核心思路是通过计算前一天的最高价、最低价和收盘价来确定当天的枢轴点&#xff0c;并据此计算出第一和第二阻力位以及第一和第二支撑位。 可以根据这些关键点位…...

Manus逆向工程:AI智能体的“思考”与“行动”

写在前面 本篇博客将基于 Manus 测试的行为日志,尝试反向推演其内部的核心逻辑。我们将探讨它如何巧妙地融合了计划-执行(Plan-Execute) 和 ReAct(Reasoning and Acting,即思考与行动) 两种范式,并灵活运用浏览器和 Python 解释器等工具来攻克复杂任务。 基本逻辑:从…...

Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本

目录 一、前言 二、CMake简介 三、CMake与其他常见的构建、编译工具的联系 四、CMake入门 1、CMake的使用注意事项 2、基本的概念和术语 3、CMake常用的预定义变量 4、CMakeLists.txt文件的基本结构 五、上手实操 1、示例 ​编辑 2、一个正式的工程构建 2.1基本构…...

Keil5 MDK 安装教程

## 简介 Keil MDK&#xff08;Microcontroller Development Kit&#xff09;是ARM开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于ARM Cortex-M系列微控制器的开发。MDK包含了μVision IDE和调试器、ARM C/C编译器、中间件组件等工具。本教程将指导您完…...

深入浅出 IPFS 在 DApps 和 NFT 中的应用:以 Pinata 实战为例

目录 IPFS背景什么是 IPFS?IPFS 在 DApps 与 NFT 中的作用什么是 Pinata?为什么使用它?使用原生IPFS上传下载文件(HTML + JavaScript 示例)使用Pinata上传下载文件(HTML + JavaScript 示例)注册并创建APIKey使用 Pinata 上传文件和JSON(HTML + JavaScript 示例)总结IP…...

如何高效集成MySQL数据到金蝶云星空

MySQL数据集成到金蝶云星空&#xff1a;SC采购入库-深圳天一-OK案例分享 在企业信息化建设中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——“SC采购入库-深圳天一-OK”&#xff0c;详细探讨如何通过轻易云数据…...

通过POI实现对word基于书签的内容替换、删除、插入

一、基本概念 POI&#xff1a;即Apache POI&#xff0c; 它是一个开源的 Java 库&#xff0c;主要用于读取 Microsoft Office 文档&#xff08;Word、Excel、PowerPoint 等&#xff09;&#xff0c;修改 或 生成 Office 文档内容&#xff0c;保存 为对应的二进制或 XML 格式&a…...

FlashInfer - 测试的GPU H100 SXM、A100 PCIe、RTX 6000 Ada、RTX 4090

FlashInfer - 测试的GPU H100 SXM、A100 PCIe、RTX 6000 Ada、RTX 4090 flyfish GPU 技术参数术语 1. Memory bandwidth (GB/s) 中文&#xff1a;显存带宽&#xff08;单位&#xff1a;GB/秒&#xff09; 定义&#xff1a;显存&#xff08;GPU 内存&#xff09;与 GPU 核心…...

MCP:开启AI的“万物互联”时代

MCP&#xff1a;开启AI的“万物互联”时代 ——从协议标准到生态革命的技术跃迁 引言&#xff1a;AI的“最后一公里”困境 在2025年的AI技术浪潮中&#xff0c;大模型已从参数竞赛转向应用落地之争。尽管模型能生成流畅的对话、创作诗歌甚至编写代码&#xff0c;但用户逐渐发现…...

企业级IP代理解决方案:负载均衡与API接口集成实践

在全球化业务扩张与数据驱动决策的背景下&#xff0c;企业级IP代理解决方案通过负载均衡技术与API接口集成&#xff0c;可有效应对高频请求、反爬机制及合规风险。以下是基于企业级场景的核心实践要点&#xff1a; 一、负载均衡与IP代理的深度协同 动态IP池的负载均衡策略 轮询…...

Vector和list

一、Vector和list的区别——从“它们是什么”到“区别在哪儿” 1. 它们是什么&#xff1f; Vector&#xff1a;类似于一排排整齐的书架&#xff08;数组&#xff09;&#xff0c;存放元素时&#xff0c;元素排成一条线&#xff0c;连续存储。可以很快通过编号&#xff08;索引…...

MongoDB从入门到实战之Windows快速安装MongoDB

前言 本章节的主要内容是在 Windows 系统下快速安装 MongoDB 并使用 Navicat 工具快速连接。 MongoDB从入门到实战之MongoDB简介 MongoDB从入门到实战之MongoDB快速入门 MongoDB从入门到实战之Docker快速安装MongoDB 下载 MongoDB 安装包 打开 MongoDB 官网下载页面&…...

Excelize 开源基础库发布 2.9.1 版本更新

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库&#xff0c;基于 ECMA-376&#xff0c;ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Excel、WPS、OpenOffice 等办公软件创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&#xf…...

package-lock.json能否直接删除?

package-lock.json能否直接删除&#xff1f; package-lock.json 生成工具&#xff1a;由 npm 自动生成。 触发条件&#xff1a;当运行 npm install 时&#xff0c;如果不存在 package-lock.json&#xff0c;npm 会创建它&#xff1b;如果已存在&#xff0c;npm 会根据它精确安…...

Profibus DP主站转Modbus RTU/TCP网关接艾默生流量计与上位机通讯

Profibus DP主站转Modbus RTU/TCP网关接艾默生流量计与上位机通讯 艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关的通讯&#xff0c;是现代工业自动化中的一个关键环节。为了实现这一过程&#xff0c;我们需要了解一些基础概念和具体操作方法。 在工业自动化系统中&…...

promise的说明

目录 1.说明 2.创建promise 3.处理promise结果 4.promise的链式调用 5.静态方法 6.错误处理及误区 7.then() 内部进行异步操作时&#xff0c;需返回新的 Promise 8.promise链式调用控制异步方法的执行顺序 9.总结 1.说明 Promise 是 JavaScript 中处理异步操作的核心对…...

Pass-the-Hash攻击原理与防御实战指南

当黑客说出"我知道你的密码"时&#xff0c;可能连他们自己都不知道你的真实密码。在Windows系统的攻防战场上&#xff0c;​​Pass-the-Hash&#xff08;哈希传递攻击&#xff09;​​就像一把可以复制的万能钥匙——攻击者不需要知道密码明文&#xff0c;仅凭密码的…...

Linux proc文件系统 内存影射

文章目录 常见的内存分配函数/proc/pid/ 目录解析 用户进程的内存空间分配算法mmap 分配大内存可能不在堆中换为 malloc 现象相同 常见的内存分配函数 malloc / calloc / realloc&#xff08;来自 C 标准库&#xff09; void *malloc(size_t size)&#xff1a;分配 size 字节…...

五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 前言&#xff1a; 想玩转大数据&#xff0c;Hadoop集群是绕不开的一道坎。很多小伙伴一看到集群部署就头大&#xff0c;各种配置、各种坑。别慌&#xff01;这篇教程就是你的“救生圈”。 …...

电流检测放大器的优质选择XBLW-INA180/INA181

前言&#xff1a; 在当前复杂的国际贸易环境下&#xff0c;关税的增加使得电子元器件的采购成本不断攀升&#xff0c;电子制造企业面临着巨大的成本压力。为了有效应对这一挑战&#xff0c;实现国产化替代已成为众多企业降低生产成本、保障供应链稳定的关键战略。对此芯伯乐推出…...

5.18-AI分析师

强化练习1 神经网络训练案例&#xff08;SG&#xff09; #划分数据集 #以下5行需要背 folder datasets.ImageFolder(rootC:/水果种类智能训练/水果图片, transformtrans_compose) n len(folder) n1 int(n*0.8) n2 n-n1 train, test random_split(folder, [n1, n2]) #训…...

毕业论文,如何区分研究内容和研究方法?

这个问题问得太好了&#xff01;&#x1f60e; “研究内容”和“研究方法”经常被初学者&#xff08;甚至一些老油条&#xff09;混淆&#xff0c;尤其写论文开题报告时&#xff0c;一不小心就“内容”和“方法”全混在一块儿&#xff0c;连导师都看懵。 今天就来给大家一文讲…...