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

pybind11项目实战:从C++源码到带完整类型提示的Python包,一步都不少

Pybind11全流程实战构建带智能提示的C扩展包在Python生态中直接调用C高性能代码一直是个诱人的方案而pybind11的出现让这个过程变得前所未有的简单。但很多开发者忽略了一个关键问题当我们把精心优化的C代码打包成.pyd模块后Python开发者使用时会失去现代IDE的所有智能提示和类型检查能力。本文将带你完整走通从C源码到带完整类型提示的Python包的工业化流程让你的扩展库既保持原生性能又拥有纯Python库般的开发体验。1. 项目架构设计与环境准备构建一个生产级pybind11项目远不止是写几行绑定代码那么简单。我们需要考虑跨平台编译、类型提示生成、打包分发等完整链条。一个典型的项目结构应该包含以下层次project-root/ ├── CMakeLists.txt # 主构建配置 ├── pyproject.toml # 现代Python打包配置 ├── src/ │ ├── core/ # C核心实现 │ └── python/ # Python绑定层 ├── stubs/ # 生成的.pyi文件 └── tests/ # 跨语言测试核心工具链版本选择工具推荐版本备注pybind112.10必须支持stub生成特性CMake3.20现代Python模块支持Python3.8类型提示标准稳定安装基础依赖# 开发环境全局依赖 pip install pybind11-stubgen cmake ninja # 项目本地依赖推荐使用venv python -m pip install -U pip setuptools wheel2. C模块的pybind11绑定实践编写高性能绑定时类型注解的质量直接决定了最终生成的.pyi文件可用性。以下是一个带有完整类型提示的绑定示例#include pybind11/pybind11.h #include pybind11/stl.h // 支持STL容器自动转换 namespace py pybind11; class DataProcessor { public: // 使用PYBIND11_EXPORT确保符号可见 PYBIND11_EXPORT explicit DataProcessor(int max_workers); // 使用py::arg和py::kw_only实现命名参数 PYBIND11_EXPORT std::vectorfloat process( const std::vectorfloat inputs, float scale_factor 1.0f, bool normalize true ) const; }; // 使用PYBIND11_MODULE宏定义模块入口 PYBIND11_MODULE(core, m) { py::class_DataProcessor(m, DataProcessor) .def(py::initint(), py::arg(max_workers), py::kw_only()) .def(process, DataProcessor::process, py::arg(inputs), py::arg(scale_factor) 1.0f, py::arg(normalize) true); }关键绑定技巧为所有导出类添加PYBIND11_EXPORT宏使用py::arg为每个参数指定名称对构造函数使用py::kw_only()强制关键字参数避免使用C风格指针优先使用std::shared_ptr3. 自动化构建与stub生成集成现代CMake配置应该将stub生成作为构建流程的有机组成部分。下面是一个集成pybind11-stubgen的CMake脚本片段# 主CMakeLists.txt find_package(Python COMPONENTS Interpreter Development REQUIRED) add_subdirectory(extern/pybind11) # 假设pybind11作为子模块 # 定义核心库目标 add_library(core SHARED src/core/data_processor.cpp) target_include_directories(core PRIVATE include) # 定义Python模块目标 pybind11_add_module(pydemo src/python/bindings.cpp) target_link_libraries(pydemo PRIVATE core) # 自定义stub生成目标 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/stubs/pydemo.pyi COMMAND ${Python_EXECUTABLE} -m pybind11_stubgen --ignore-invalidall --output-dir${CMAKE_CURRENT_BINARY_DIR}/stubs pydemo DEPENDS pydemo WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT Generating type stubs for pydemo module ) add_custom_target(generate_stubs ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/stubs/pydemo.pyi )构建流程优化技巧# 典型构建命令支持多平台 cmake -B build -GNinja -DCMAKE_BUILD_TYPERelease cmake --build build --target generate_stubs4. 打包分发与开发者体验优化现代Python打包工具链已经全面转向pyproject.toml。以下是一个支持类型提示的完整配置示例[build-system] requires [cmake3.20, pybind112.10, setuptools42, wheel] build-backend setuptools.build_meta [project] name pydemo version 0.1.0 description 高性能数据处理模块 requires-python 3.8 [tool.setuptools] packages [pydemo] package-dir { build/stubs} # 指向生成的.pyi文件位置 [tool.setuptools.cmake] build-dir build define [PYBIND11_EXPORT_ALLON] # 确保所有符号可见分发关键点将生成的.pyi文件与.pyd一起打包在MANIFEST.in中包含所有必要文件include build/lib/pydemo.pyd include build/stubs/pydemo.pyi使用auditwheel(Linux)或delocate(macOS)修复二进制依赖5. CI/CD流程中的自动化保障成熟的工业级项目应该将类型提示生成和验证纳入持续集成。以下是GitHub Actions的一个典型配置name: Build and Test on: [push, pull_request] jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] python-version: [3.8, 3.9, 3.10] steps: - uses: actions/checkoutv3 with: submodules: recursive - name: Set up Python uses: actions/setup-pythonv4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install pybind11-stubgen cmake ninja pytest mypy - name: Configure and Build run: | cmake -B build -GNinja cmake --build build --target generate_stubs - name: Run type checking run: | mypy --config-file mypy.ini build/stubs/质量门禁检查项生成的.pyi文件必须通过mypy静态检查所有导出函数必须包含完整参数类型模块级__all__列表必须与导出符号一致6. 高级技巧与疑难排错当处理复杂模板类时stub生成可能会遇到问题。以下是几个实战中总结的解决方案模板类处理技巧// 显式实例化模板并导出 template class PYBIND11_EXPORT DataProcessordouble; template class PYBIND11_EXPORT DataProcessorfloat; // 在绑定代码中注册所有可能类型 py::class_DataProcessordouble(m, DataProcessorDouble) // ... 方法绑定 py::class_DataProcessorfloat(m, DataProcessorFloat) // ... 方法绑定常见问题排查表问题现象可能原因解决方案生成的.pyi文件为空符号未导出添加PYBIND11_EXPORT宏IDE无法识别类型.pyi文件位置错误确保与.pyd同目录导入时报属性错误动态属性未声明使用py::dynamic_attr()对于需要动态注册属性的情况应该在绑定代码中声明py::class_DynamicType(m, DynamicType, py::dynamic_attr())在项目根目录添加py.typed空文件可以明确告知类型检查器这个包提供了类型信息touch build/stubs/py.typed

相关文章:

pybind11项目实战:从C++源码到带完整类型提示的Python包,一步都不少

Pybind11全流程实战:构建带智能提示的C扩展包 在Python生态中直接调用C高性能代码一直是个诱人的方案,而pybind11的出现让这个过程变得前所未有的简单。但很多开发者忽略了一个关键问题:当我们把精心优化的C代码打包成.pyd模块后,…...

dplyr和tidyr用法继

1. 引入 在现代 AI 工程中,Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的,官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为,最好的办法…...

【CD4022八进制计数器脉冲分配器】2023-5-31

缘由CD4022可以连接成4进制吗? - 24小时必答区 脉宽调节 中医不用做胃镜,观察出口物颜色是否带血判断,检查表里可判断远近位置确诊,在表为近端,在里为远端,鲜红色为近端,暗黑色为远端,远端在胃…...

Function Calling详解:让AI连接现实世界

Function Calling详解:让AI连接现实世界 1. 核心概念 在当今AI技术飞速发展的时代,大语言模型(LLMs)如GPT-4、Claude等展现出了惊人的语言理解和生成能力。然而,这些模型本质上是"静态"的——它们的知识截止到训练数据的时间点,无法直接访问实时数据,也无法执…...

【51单片机非精准计时2个外部中断启停】2023-5-29

缘由https://ask.csdn.net/questions/7953369/54217159 按下按键1复位,按下按键2开始 ,51单片机8位数码管计时器 ,程序简便一些 #include "reg52.h" unsigned char code SMD[]{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F ,0x6…...

JaCoCo在CI/CD流水线中的应用:自动化测试与质量门禁终极指南

JaCoCo在CI/CD流水线中的应用:自动化测试与质量门禁终极指南 【免费下载链接】jacoco :microscope: Java Code Coverage Library 项目地址: https://gitcode.com/gh_mirrors/ja/jacoco JaCoCo(Java Code Coverage Library)是一款强大的…...

技术判断力之AI三问峭

认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...

PDE (Processing D Editor) 三维场景编辑器 · 软件白皮书 · 基于 v..德

MySQL 中的 count 三兄弟:效率大比拼! 一、快速结论(先看结论再看分析) 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的!我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄…...

如何用WebSocket构建高性能物联网实时通信系统:IoT-Technical-Guide完整指南

如何用WebSocket构建高性能物联网实时通信系统:IoT-Technical-Guide完整指南 【免费下载链接】IoT-Technical-Guide :honeybee: IoT Technical Guide --- 从零搭建高性能物联网平台及物联网解决方案和Thingsboard源码分析 :sparkles: :sparkles: :sparkles: (IoT Pl…...

终极Undotree性能优化指南:让Vim撤销历史管理如丝般顺滑

终极Undotree性能优化指南:让Vim撤销历史管理如丝般顺滑 【免费下载链接】undotree The undo history visualizer for VIM 项目地址: https://gitcode.com/gh_mirrors/un/undotree Undotree是Vim编辑器中一款强大的撤销历史可视化插件,它能将复杂…...

量化入门-用Python筛选爆量上涨的股票酒

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

Laravel Cashier Stripe Webhook完整教程:实时处理支付事件

Laravel Cashier Stripe Webhook完整教程:实时处理支付事件 【免费下载链接】cashier-stripe Laravel Cashier provides an expressive, fluent interface to Stripes subscription billing services. 项目地址: https://gitcode.com/gh_mirrors/ca/cashier-strip…...

快速体验VoxCPM-1.5:一键脚本启动,开启语音合成之旅

快速体验VoxCPM-1.5:一键脚本启动,开启语音合成之旅 1. 语音合成技术的新选择 想象一下,你只需要上传一段10秒的语音样本,就能让AI用同样的声音朗读任何文字——这就是VoxCPM-1.5带来的神奇体验。作为一款开箱即用的文本转语音工…...

RePKG终极指南:Wallpaper Engine资源解包与纹理转换完整方案

RePKG终极指南:Wallpaper Engine资源解包与纹理转换完整方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经面对Wallpaper Engine的PKG文件束手无策&#xf…...

在同一个时间点,一个物体不能出现在两个地方。

一个人在某个特定的时间点,只能出现在一个地方。如果你画出这个人的运动轨迹,它一定能通过垂线校验。画一个圆 坐标在圆中心,用垂直线通过圆,然后标记出 通过圆半径3 内的两个点 导致不知道f(x)到底是上方还是下方的点&#xff0c…...

大学c语言搜题app有哪些 大学c语言搜题软件大全

C语言是很多学习IT技术的同学们必须要学习和精通的编程语言,想要成为高级的程序员就一定要认真学习,大学c语言搜题app有哪些就是很多想在课下对知识进行巩固,提前预习,提升能力的同学们想知道的,下面就给大家推荐几款好…...

motionEye 存储管理优化:自动清理与云备份策略终极指南

motionEye 存储管理优化:自动清理与云备份策略终极指南 【免费下载链接】motioneye A web frontend for the motion daemon. 项目地址: https://gitcode.com/gh_mirrors/mo/motioneye motionEye 是一款强大的 motion 守护进程 Web 前端工具,能帮助…...

给STM32新手:别再死记硬背地址了,用结构体映射GPIOA寄存器(附验证代码)

给STM32新手:别再死记硬背地址了,用结构体映射GPIOA寄存器(附验证代码) 刚接触STM32寄存器开发时,看到手册上密密麻麻的十六进制地址,是不是感觉头大?每次操作寄存器都要翻手册查地址&#xff0…...

vis跨平台部署指南:在Linux、macOS和BSD系统上的安装与配置终极教程

vis跨平台部署指南:在Linux、macOS和BSD系统上的安装与配置终极教程 【免费下载链接】vis A vi-like editor based on Plan 9s structural regular expressions 项目地址: https://gitcode.com/gh_mirrors/vis/vis vis是一款基于Plan 9结构化正则表达式的类v…...

Elevator Saga终极指南:如何用JavaScript编程控制电梯运输系统

Elevator Saga终极指南:如何用JavaScript编程控制电梯运输系统 【免费下载链接】elevatorsaga The elevator programming game! 项目地址: https://gitcode.com/gh_mirrors/el/elevatorsaga Elevator Saga是一款极具挑战性的电梯编程游戏,通过Jav…...

7天掌握强化学习:从零开始在FrozenLake环境中实现Q-learning算法的完整指南

7天掌握强化学习:从零开始在FrozenLake环境中实现Q-learning算法的完整指南 【免费下载链接】Reinforcement-Learning Learn Deep Reinforcement Learning in 60 days! Lectures & Code in Python. Reinforcement Learning Deep Learning 项目地址: https://…...

终极Kinto权限系统完全指南:如何精细控制数据访问与安全共享

终极Kinto权限系统完全指南:如何精细控制数据访问与安全共享 【免费下载链接】kinto A generic JSON document store with sharing and synchronisation capabilities. 项目地址: https://gitcode.com/gh_mirrors/ki/kinto Kinto是一个强大的JSON文档存储系统…...

终极RT-DETR社区贡献指南:从新手到核心开发者的完整路径

终极RT-DETR社区贡献指南:从新手到核心开发者的完整路径 【免费下载链接】RT-DETR [CVPR 2024] Official RT-DETR (RTDETR paddle pytorch), Real-Time DEtection TRansformer, DETRs Beat YOLOs on Real-time Object Detection. 🔥 🔥 &…...

终极指南:如何使用Apache Shiro与JWT实现现代Web应用的无状态认证

终极指南:如何使用Apache Shiro与JWT实现现代Web应用的无状态认证 【免费下载链接】shiro Apache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management 项目地址: …...

终极Deno安全开发指南:从权限控制到依赖审计的完整实践

终极Deno安全开发指南:从权限控制到依赖审计的完整实践 【免费下载链接】awesome-deno Curated list of awesome things related to Deno 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-deno Deno作为一个简单、现代且安全的JavaScript和TypeScript运…...

终极UI组件矩阵完全指南:从Checkbox到Combobox的全方位解析

终极UI组件矩阵完全指南:从Checkbox到Combobox的全方位解析 【免费下载链接】open-ui Maintain an open standard for UI and promote its adherence and adoption. 项目地址: https://gitcode.com/gh_mirrors/op/open-ui Open UI项目致力于维护开放的UI标准…...

Dhall性能优化与部署指南:构建高效配置管理系统的终极方案

Dhall性能优化与部署指南:构建高效配置管理系统的终极方案 【免费下载链接】dhall-lang Maintainable configuration files 项目地址: https://gitcode.com/gh_mirrors/dh/dhall-lang Dhall是一个强大的配置语言,旨在提供可维护的配置文件解决方案…...

10个Yellowbrick可视化技巧:提升机器学习模型诊断效率

10个Yellowbrick可视化技巧:提升机器学习模型诊断效率 【免费下载链接】yellowbrick Visual analysis and diagnostic tools to facilitate machine learning model selection. 项目地址: https://gitcode.com/gh_mirrors/ye/yellowbrick Yellowbrick是一款强…...

终极字体优化指南:让你的home55个人主页加载速度提升50%的实用技巧

终极字体优化指南:让你的home55个人主页加载速度提升50%的实用技巧 【免费下载链接】home- 个人主页,我的个人主页,个人主页源码,主页模板,homepage 项目地址: https://gitcode.com/gh_mirrors/home55/home- 在…...

终极JHenTai插件开发指南:从零开始扩展跨平台漫画应用功能

终极JHenTai插件开发指南:从零开始扩展跨平台漫画应用功能 【免费下载链接】JHenTai A cross-platform manga app made for e-hentai & exhentai by Flutter 项目地址: https://gitcode.com/gh_mirrors/jh/JHenTai JHenTai是一款基于Flutter开发的跨平台…...