尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
使用Pybind11将Python代码封装为可在C++环境调用的.pyd
一、环境准备1.1 Python环境安装Python官网速度慢可从镜像站下载CNPM Binaries Mirror找到需要版本安装即可。1.2 C环境Visual Studio官网下载即可。速度慢软件管家-安全、稳定、纯净的软件下载平台-首页1.3 相关库安装使用Pybind11库可以使Python与C中暴露的接口被另一方调用。可以使用pip安装pip install pybind11 (-i https://pypi.tuna.tsinghua.edu.cn/simple)使用cmake生成项目pip install cmake二、绑定Py与C2.1 项目结构推荐结构如下项目名纯英/├─CMakeLists.txt├─ src/│ ├─ xxx1.cpp│ ├─ xxx2.cpp│ └─ bind.cpp└─ python/├─ xxx1.py└─ xxx2.py其中xxx1.py与xxx2.py是将要向C暴露接口的程序xxx1、xxx2同名的cpp文件为对应的绑定声明文件bind.cpp为主绑定文件CMakeLists.txt为配置信息文件我们下一小节详细描述。2.2 CMakeLists.txt我们cmake用来生成项目CMakeLists.txt用于描述配置信息。cmake_minimum_required(VERSION 3.12) #最低cmake版本 project(项目名) # 查找python find_package(Python COMPONENTS Interpreter Development REQUIRED) # 查找pybind11 find_package(pybind11 REQUIRED) # 设置输出目录 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 添加模块 pybind11_add_module(项目名 src/xxx1.cpp src/xxx2.cpp src/bind.cpp ) # 设置包含目录 target_include_directories(项目名 PRIVATE ${PYTHON_INCLUDE_DIRS} ) # 设置链接库 target_link_libraries(项目名 PRIVATE ${PYTHON_LIBRARIES} ) # 复制python文件到输出目录 file(GLOB PYTHON_FILES python/*.py) file(COPY ${PYTHON_FILES} DESTINATION ${CMAKE_BINARY_DIR}/bin)2.3 绑定代码2.3.1 绑定声明文件src中如xxx1.cpp即为绑定声明文件用于声明xxx1.py中我们将要调用的函数。编写方法如下#include pybind11/pybind11.h #include pybind11/stl.h #include pybind11/functional.h #include pybind11/numpy.h //调用pybind11头文件 namespace py pybind11; void init_xxx1(py::module_ m) { // 绑定暴露函数 m.def(函数名, [](带有数据类型的python中参数) { py::object module py::module_::import(xxx1); module.attr(函数名)(无声明类型的参数); }, 备注); }其中带有数据类型的python中参数应带有类型声明如const std::string path无声明类型的参数只写path即可。常见的数据类型声明方法字符串const std::string数组const std::vector数据类型整形/浮点int / float其他诸如xxx2.cpp类似编写即可。2.3.2 主绑定文件src中bind.cpp为主绑定文件其中包含了全部函数的声明编写方法如下#include pybind11/pybind11.h namespace py pybind11; void init_xxx1(py::module_ ); void init_xxx2(py::module_ ); //这里的init_xxx1要与绑定声明文件中对应 PYBIND11_MODULE(xctd_bind, m) { m.doc() 模型注释; init_xxx1(m); init_xxx2(m); }2.4 构建项目在项目根目录下打开cmd打开根目录后在路径栏输入cmd回车即可打开。mkdir build #创建build目录 cd build #进入build目录 cmake .. #在上一级目录运行cmake此时将自动识别出CMakeLists文件 #并根据配置信息在build目录下生成项目文件 cmake --build . --config Release #以release模式生成项目运行后即可在项目名/build/bin/Release中找到bind.xxxxxxxx.pyd其中xxxxxxxx为python版本表示与平台架构表示也可能没有不影响使用。此时得到.pyd链接库可以正常复制到其他项目中调用使用时应与py源代码一起使用。三、使用说明3.1 使用样例使用时应将bind.pyd与xxx1.py、xxx2.py一同复制使用调用样例如下#include pybind11/embed.h #include pybind11/stl.h #include Python.h #include iostream #include vector #include algorithm namespace py pybind11; static bool xxx1Once(py::module xctd, 带有类型声明的参数) { try { xctd.attr(xxx1函数名)(无声明类型的参数); } catch (const py::error_already_set e) { std::cerr Python 异常: e.what() std::endl; return false; } catch (const std::exception e) { std::cerr C 异常: e.what() std::endl; return false; }//捕获异常 return true; }//ProcessXctdData static bool xxx2Once(py::module xctd, 带有类型声明的参数) { try { xctd.attr(xxx2函数名)(无声明类型的参数); } catch (const py::error_already_set e) { std::cerr Python 异常: e.what() std::endl; return false; } catch (const std::exception e) { std::cerr C 异常: e.what() std::endl; return false; }//捕获异常 return true; }//DelayCorrected.main int main() { //初始化py解释器******仅初始化一次需放在主线程、main函数中使用 py::scoped_interpreter guard{}; if (!Py_IsInitialized()) { std::cout Init Py Fail!\n; return -1; } //声明模型 auto xctd py::module_::import(bind); //调用函数 xxx1Once(xctd, 无声明类型的参数); xxx2Once(xctd, 无声明类型的参数); return 0; }3.2 注意事项3.2.1 环境配置使用vs环境下调用python与pybind11需要添加附加包含目录、附加库目录与附加依赖项方法如下。3.2.1.1 附加包含目录右键单击右侧列表中项目名称选择“属性”在弹出的窗口中依次选择:C/C - 常规并在右侧“附加包含目录”后输入pybind11与python的include目录目录之间使用半角分号;隔开。目录获取方法如下在cmd中输入pip show pybind11其中Location项为pybind11库绝对位置将冒号后面复制并添加\pybind11\include此为pybind11包含目录目录将Lib及后续部分删除改为include即为python包含目录目录。3.2.1.2 附加库目录在项目属性窗口中依次选择:连接器 - 常规并在右侧“附加库目录”后输入python的库目录。库目录为附加包含目录条目下获取的Location项Lib及后续部分删除改为libs即为python库目录。3.2.1.3 附加依赖项在项目属性窗口中依次选择:连接器 - 输入在右侧“附加依赖项”后输入python的库目录并在目录结尾添加\pythonxxx.lib其中xxx为python版本可打开python库目录自行查看。3.2.2 第三方python库pybind11运行python代码时需要安装代码中使用的三方库使用pip安装即可
RELATED

相关推荐

一个框架吃透五大平台:MediaCrawler-new 多平台爬虫框架数据采集全流程指南

一个框架吃透五大平台:MediaCrawler-new 多平台爬虫框架数据采集全流程指南

一个框架吃透五大平台:MediaCrawler-new 多平台爬虫框架数据采集全流程指南 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new 做内容运营的周哥,第一次听说"社交媒体数据采集"这…

📅 2026/10/28 16:24:52
VecMap 数据准备全攻略:get_data.sh 一键下载多语言词嵌入与词典

VecMap 数据准备全攻略:get_data.sh 一键下载多语言词嵌入与词典

VecMap 数据准备全攻略:get_data.sh 一键下载多语言词嵌入与词典 【免费下载链接】vecmap A framework to learn cross-lingual word embedding mappings 项目地址: https://gitcode.com/gh_mirrors/ve/vecmap VecMap 是一个用于学习跨语言词嵌入映射&#x…

📅 2026/10/28 16:25:43
零门槛 spotify 歌单下载指南:用 spotify-downloader 把在线收藏一劳永逸存进本地

零门槛 spotify 歌单下载指南:用 spotify-downloader 把在线收藏一劳永逸存进本地

零门槛 spotify 歌单下载指南:用 spotify-downloader 把在线收藏一劳永逸存进本地 【免费下载链接】spotify-downloader Download your Spotify playlists and songs along with album art and metadata (from YouTube if a match is found). 项目地址: https://g…

📅 2026/9/9 1:35:10
MORE NEWS

更多资讯

📰

LetSMS:开源短信压力测试框架实战指南

简介:这是一套面向PHP开发者与安全测试人员的开源短信压力测试工具源码,基于ThinkPHP框架构建,适用于学习接口压测原理、定制化短信轰炸防护验证及分布式脚本监控实践。资源共808个文件,主体为488个PHP核心逻辑与控制器文件&#…

📰

智能体源码可审查性:从动作日志到代码审计的工程实践

1. 这篇论文为什么让所有智能体开发者都坐不住了?Kepler团队刚发布的ARC-AGI-3论文里,有一句结论像颗小石子砸进了AI工程圈的深水潭:“ARC-AGI-3在基准测试中取得满分,并非源于模型参数的玄学调优,而极可能来自对底层动…

📰

基恩士IV视觉传感器与西门子PLC的PROFINET直连实战指南

简介:本资源是面向工业自动化工程师与PLC系统集成人员的PROFINET通信实战示例,聚焦基恩士IV视觉系统与西门子S7系列PLC在TIA博途V14环境下的高效协同。解决多品牌设备间实时图像数据采集、指令下发与状态反馈等典型产线集成难题,适用于质量检…

📰

Grok 4.7工程化实践:从代码生成到合规协作者

1. 项目概述:这不是一场“AI编程能力测评”,而是一次技术传播链路的典型切片最近刷到“Elon Musk 认可 Grok 4.7 编程能力”这个标题,很多人第一反应是点开看Musk又说了什么惊人言论,或者急着去试用Grok写个Hello World。但作为连…

📰

Agentic AI责任边界与架构设计实践

1. Agentic AI的责任边界与架构师角色定位当AI系统开始具备自主决策能力时,提示工程架构师就站在了技术伦理的第一道防线上。我最近在金融领域部署一个自动化审批AI时,系统在没有人工干预的情况下拒绝了一位信用良好的小微企业主贷款申请——这让我深刻意…

📰

AI编程超能力:从语义理解到本地化开发工作流

1. “Superpowers”不是功能开关,而是开发者工作流的范式迁移最近在几个技术社区和内部协作群里,频繁看到“superpowers”这个词被当作某种神秘插件、一键增强包,甚至有人直接搜“superpowers 下载”“superpowers 官网”。其实这背后没有一个…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬