Python调用C++之PyBind11(二)

C++和Python混合编程之Pybind11的简单使用 用Pybind11实现C++/Python混合编程以及一些注意事项 阅读详情

以下为授权转载的一盎司科技公众号文章


PyBind11是一个轻量级的C++库,主要用于创建现有C++代码的Python绑定,使用了很多C++新特性。

下面将介绍一些PyBind11日常会用到的一些功能点,如分拆转换文件,类的纯虚函数使用,函数重载等,关于PyBind11的详细内容可参考官方文档(https://pybind11.readthedocs.io/en/stable/)。

示例代码地址:

GitHub地址:https://github.com/iounce/python-cpp-demo

Gitee地址:https://gitee.com/iounce_admin/python-cpp-demo

环境

  • Windows操作系统:Windows10(21H2,19044.1766)

  • C++开发环境:Visual Studio 2022社区版

  • Python:3.10.4

  • PyBind11:2.11.1

分拆转换文件

为了规范以及方便管理,通常可以将转换内容分拆到多个文件之中,然后在主转换文件中引用即可,参考上一篇的例子,作如下分拆:

  • func.h里面的函数添加到python_func.h转换文件中

图片

  • bird.h里面的函数添加到python_bird.h转换文件中

图片

  • 主转换文件python_api.cpp引用python_func.h和python_bird.h文件

图片

定义类纯虚函数

在文件class.h中,定义抽象类Base,包含protected访问的纯虚函数valid(),具体如下:

图片

编写转换文件python_class.h,增加对纯虚函数valid()的转换。由于抽象类无法实例化,需要借助自定义类实现转换操作。首先定义PyBase类,继承Base类,作为新的基类。然后再新增PyPublicBase类,将protected访问的valid函数改为public,这样可以直接在外部访问。具体如下:

图片

定义类静态变量

简单起见,定义public访问的静态变量,具体如下:

图片

在转换文件中,需要增加特别标记def_readwrite_static来定义静态变量,具体如下:

图片

定义类重载函数

定义set()函数,分别设置整形和字符串类型的入参,具体如下:

图片

在转换文件中,需要增加特别标记overload_cast来定义重载函数,具体如下:

图片

定义类指针数组函数

定义parse函数,类似main函数的入参,具体如下:

图片

在编写转换函数过程中,首先需要调整入参,譬如main函数,一般来说只是传递空格分隔的参数,而无需设置参数个数,所以在python调用过程中传递字符串list即可。此处增加std::vector和Python中list的转换,计算出参数个数再传递给C++函数。具体如下:

图片

编写Python测试程序

首先在主转换文件添加类的转换文件python_class.h,然后初始化,具体如下:

图片

编译生成Python包后,先将生成的文件pybind11_demo.cp310-win_amd64.pyd(环境不同生成文件名可能有差异)拷贝到当前目录,然后编写测试程序main.py并执行:

图片

说明:由于Base类为虚基类,故需要定义子类来继承后使用,如Derive类。

pybind11库(用于在python中调用C++)的安装与配置使用(windows/linux系统) pybind11是用来进行C++和python互相调用的库。 用pybind11的动机就是再用python处理数据的时候很慢,但是又无法用GPU加速,网上找了一下发现了这个库,利用python调用C++的程序,处理速度能快不少,因此就决定探索一下。 pybind11官方链接 但是作为一个编程菜鸡,对C++了解很少,一直用的python,所以走了很多弯路,花了好几天的工夫才弄成功。下面说一下我遇到的主要问题。 1.pybind11安装 从GitHub上下载源码:点这里下载。 2.支持的C++软件 我用了一下v 阅读详情

相关推荐

pybind11:实现Python调用C++代码(入门)

Windows下创建一个pybind11的“helloworld”项目

qq_74083422的博客 6464

python 11 字符串

#第一部分 test ="abcxABCx123abcx" v1 = test.capitalize() # 字符串首字母大写 print(v1) #结果: Abcabc123 v2 = test.casefold() #all 变小写,未知对象相应变小写 print(v2) ...

weixin_41733381的博客 424

Python调用C++之PYBIND11简介

使用传统的方法去编写Python C++扩展模块日子一去不复返啦。看了这篇文章你就懂得如何更快更好的去编写Python C++扩展模块。

SunnyZhou-1024的博客 4335

python传递参数 调用c++ 传递vector_pybind11—python numpy与C++数据传递

前言一些处理矩阵运算,图像处理算法,直接采用python实现可能速度稍微慢,效率不高,或者为了直接在python中调用其他C++第三方库。 图像,矩阵在python中通常表示为numpy.ndarray,因此如何在C++中解析numpy对象,numpy的数据如何传递到C++非常关键,解决了这些问题,就可以丝滑的在python numpy和C++中切换,互相调用。开发、测试环境windows 10,...

weixin_39614657的博客 2506

python调用c++之pybind11

之前一直从事c++相关算法及代码的相关工作,因公司内部代码管理需要,需将算法封装待python平台使用,根据此需求,对python调用c++代码的方式进行了学习,最终综合考虑封装难度及多代码管理使用pybind11进行了相关功能的实现。 pybind11是一个用于c++与python之间相互调用和数据交互的库 以我自己的算法为例介绍一下pybind11的基本使用,我的调用算法中还包含了其他的c++库,例如opencv,此处还出现了一个我没想到的bug后续会介绍。 Windows系统 Requires

m0_64355682的博客 4333

Python调用C++之PYBIND11源码分析

知其然更知其所以然。看了本文你不经能学会怎么使用pybind11去为Python编写C++扩展模块,还能知道接口背后的秘密。

SunnyZhou-1024的博客 2652

Python: pybind11:fatal error: Python.h: No such file or

这个依赖:platform-python-devel,这个包里包含有Python.h文件。所以,pybind11的编译需要platform-python-devel做支持。

mzhan017的博客 3581

使用Python和Pybind11调用C++程序(CMake编译)

pybind11 是一个轻量级的头文件库,用于在 Python 和 C++ 之间互相暴露类型,主要用于为现有的 C++ 代码创建 Python 绑定。

qq_40734883的博客 1982

《人生苦短,我用python·三》pybind11简单使用

很可能是缺少某些DLL。Pybind11 借鉴了 Boost::Python 库的设计,但使用了更为简洁的实现方式,使用了大量 C++11 的新特性,更易于使用。(1)VS2019创建动态库(我这里是写了一个C++动态库专门存放pybind11的接口),在附加包含目录加入pybind11和python头文件(注意:动态库的cpp文件不要删掉,不然编译无法生产lib文件)使用pybind11需要注意的是开发者使用哪个版本编译的pybind11,调用者也必须使用这个版本的python才可以调用。

cs1395293598的博客 2713

【pybind11】 pybind11如何调用python

pybind11 是一个轻量级的 C++ 库,用于创建 Python 扩展模块。本文介绍了 pybind11 的核心特性、安装方法和基础使用。主要内容包括:1) pybind11 作为头文件库的优势,包括简洁性、内存管理自动化和现代 C++ 语法支持;2) 多种安装方式(pip、conda 或源码编译);3) 基础绑定示例,展示如何将 C++ 函数暴露给 Python;4) 参数处理和数据类型转换,包括基本类型和 STL 容器的自动转换。pybind11 简化了 C++ 和 Python 的交互,是高性能

高山 1681

Pybind11教程:从零开始打造 Python 的 C++ 小帮手

想象你在 Python 里写了个计算器,但跑得太慢,想用 C++ 提速,又不想完全抛弃 Python。Pybind11 就像一座桥,把 C++ 的高性能代码“嫁接”到 Python 里。你可以用 Python 调用 C++ 函数,就像请了个跑得飞快的帮手来干活。

weixin_46001686的博客 4103

pybind11:python联合c++编译

1. 获取pybind112. 测试代码2.1 查看模块信息 help(randy_pybind11)2.2 python 中引入编译好的so库3. 默认参数4. 导出变量5. 绑定Numpy数组5.1 直接使用Numpy和Python功能6. Eigen数组接口7. Class7.1 最简单的c++类7.2 继承和自动下行转换8. 虚函数8.1 结合虚函数和继承Reference。

aobulaien001的博客 2969

pybind11教程

pybind11的详细介绍和cmake使用例子

性感的小君君 3139

通过pybind11来实现python调用C++接口(二)

相信大家应该都能掌握怎么让python调用C++的容器,以及class类。对于python调用C++接口的基础知识,可以参考我的博文:[通过pybind11来实现python调用C++接口(一)]。(https://blog.youkuaiyun.com/shouqi321/article/details/130439525)通过g++ pybind.cpp -std=c++11 -shared -fPIC。如果用class的方式,怎么调用呢?编译生成目标动态库。

shouqi321的博客 659

Pybind11 教程续篇:C++ 如何请 Python 小助手干活

基础:用 py::exec 跑代码,py::module_::import 调模块。函数:用 .attr() 调用,.cast() 转换结果。高级:传 vector 用 stl.h,调库如 numpy。比喻:C++ 是老板,Python 是小助手,Pybind11 是电话线。通过这个教程,你应该能让 C++ 轻松请 Python 帮忙干活!如果遇到问题,欢迎私聊。

weixin_46001686的博客 1458

如何让Arduino IDE支持你手里的STM32 nucleo开发板

Arduino IDE开发环境在默认情况下不支持STM32 NUCLEO开发板,只有通过添加附加开发板管理包才能使用。目前为止,只有一部分板子支持使用Arduino IDE开发环境进行开发,分别是 Nucleo F207ZG, Nucleo F429ZI, Nucleo F030R8, Nucleo F091RC, Nucleo F103RB, Nucleo F303RE, Nucl...

mzw72188552的专栏 8971

(4)python开发经验

python、pyqt、pyside6开发经验,python调用C++库

mahuifa的博客 1256

HFSS初学笔记(二)——75Ω带状线设计

本文利用HFSS软件设计并优化了一条75Ω的带状线结构,通过调整几何参数和介质材料,实现了精确的阻抗控制。仿真结果显示,该带状线在高频信号传输中的表现优越,具有良好的S参数、低插入损耗和极小的信号反射损耗。

2401_87464239的博客 4541

Pybind11使用总结(实现C++与Python互相调用)

Pybind11使用总结(实现C++与Python互相调用) 实验运行环境: Linux操作系统 C++11 Python 3.7 Cmake 2.8 第一步、编译pybind11 首先从https://github.com/pybind/pybind11 上下载pybind11源码。解压后进入文件夹使用cmake进行编译: mkdir build cd build cmake .. cmake --build . --config Release make // 这一步若发生错误查看pyth

sunny23666的博客 2万+

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

struggle2025的博客 1749

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 334

Python调用C++函数之Pybind11

参考了如下的文章,执行sudo apt install python3.8-dev之后问题并没有解决,所以采用了笨办法,发现Python.h文件在/usr/include/python3.8下,所以直接在cmake文件中添加include_directories(/usr/include/python3.8/),此时问题解决了。Pybind11 借鉴了。库的设计,但使用了更为简洁的实现方式,使用了大量 C++11 的新特性,更易于使用。其中,url为子模块的路径,path为该子模块存储的目录路径。

qq_32639369的博客 2098

30天入门 SAP BTP 开发系列之十四: 将 SAP Business Application Studio 里开发好的 Node.js 应用部署到 Cloud Foundry 环境中

本教程详细介绍了如何将SAP Business Application Studio中的Node.js应用部署到Cloud Foundry环境。在完成本地开发和测试后,通过cf login命令连接Cloud Foundry环境,配置manifest.yml文件指定应用参数和路由信息。使用cf push命令完成应用的上传和部署,最终使应用运行在SAP BTP的云端环境中。教程包含从路由创建到部署验证的完整流程,确保开发者能够成功将Node.js应用发布到生产环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1080
上一篇: Python调用C++之PyBind11
下一篇: C++调用Python
iounce
博客等级 码龄18年 3粉丝 0原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值