C++/Python混合编程之小结Pybind11的使用
一、pybind11简单介绍
一些python和c++混编方案:
- python官方的python/c api, 缺点:所有数据类型必须手动改为cpython封装的binding类型;
- cython,编译器支持python代码转为c代码,缺点:移值和复用成本高
- siwg 主要解决高级语言与c和c++语言交互问题,支持10几种编程语言如java、python、c#等。在python端性能表现不太好
- boost.python 为c++中广泛应用的boost开源库,编译和依赖关系繁重,如果只用于解决python的交互,大材小用了。
- pyind11 理解为boost.python的蓝本,基于c++11应用了很多新特性,pybind11 通过 c++ 编译时的自省来推断类型信息,来最大程度地减少传统拓展 python 模块时繁杂的样板代码, 且实现了常见数据类型,如 stl 数据结构、智能指针、类、函数重载、实例方法等到 python 的自动转换,其中函数可以接收和返回自定义数据类型的值、指针或引用
简言之,pybind11 是一个轻量级的 c++ 库,用于将你的 c++ 代码暴露给 python 调用(反之也可,但主要还是前者)。pybind11 借鉴了 boost::python 库的设计,但使用了更为简洁的实现方式,保证开发效率和实用性。其帮助文档链接如下:
官方文档:pybind11 documentation
中文版本:安装库 — pybind11 文档
二、pybind11环境准备
1.配置环境说明
window10+ vs2017+python3.10(本电脑安装了anaconda是python3.10这个环境,也可以使用其它版本,window要求visual studio 2017及更新版本)
2.安装pybind11
方式1:直接下载源代码 git clonegithub - pybind/pybind11: seamless operability between c++11 and python
方式2:直接用pip命令安装:pip install pybind11 或使用 pip3 install pybind11 (pip3同时会下载python3.0+版本)
查看python -m 默认下载路径:
直接指定存放目录的下载方式:
python -m pip install pybind11 --target=d:\python\site-packages
下载的pybind11目录如下:
三、python调用c++动态库测试例子
底层逻辑:把c++中编写的函数,用pybind封装为调用的pyd库,成功在python中import调用;
说明:pybind11 是只包含头文件的库,因此不需要链接到任何特殊的库,也没有中间(magic)转换步骤。win系统上c++编程时只要包含到include路径就行。注意要包含对应的python库目录。
1.vs属性配置
vs2017上新建项目,属性中包含pybind 和python对应的include目录。 我使用的是conda中python3.10所以路径不一样。
附加库目录,增加python的库目录:
添加python的lib库:
在工程属性—>常规—>目标文件扩展名修改为.pyd,配置类型改为.dll
2.编写绑定文件并测试
方法:使用pybind11_module()将所有需要封装的代码都放在里面。
pybind11_module()宏创建了一个函数,当 python 内部发出import语句时将调用该函数。
第一个参数:模块名(testpyd)作为第一个宏参数给出(它不应该在引号中)。
第二个参数:m定义了类型的变量py::module_,它是创建绑定的主接口。
module_::def():会生成绑定代码,将add()函数公开给 python。
cpp文件如下:
编译生成文件:(生成的文件要和绑定模块名称一致)
其中,pyd文件是生成的动态库,可供给python调用。以下为python调用testpyd.pyd的add函数的测试结果:
如图,在python中成功调用add函数。 注意运行时一定要在有testpyd.pyd文件的目录。
3.结构体类型的绑定
在python中测试如下:
上面print(p)的信息没有具体name,可以使用__repr__函数:
4.其它数据类型
可以查看帮助文档,按照上面的方式绑定到模块中。如果c++文件中代码调用了第三方dll库,在python中调用时,需要把dll文件放在py文件运行目录中
四、python调用c++的测试例子
底层逻辑:pybind11 使用c++ 封装了 python 类型和函数,通过python解释器可以供c++调用
1.编写一个example.py文件:【我存放于工程目录子文件夹python_scripts中】
2.编写调用example模块的c++main文件:
3.运行测试main代码
记得在属性中把,输出文件格式改为.exe。测试打印结果如下:
结果一致!
4.遗留问题
在初始化python环境时,开始使用的是py::scoped_interpreter guard{};初始化方法,但这个方法报如下错误,有检测自己的环境配置都是正常,也按初始环境的打印设置了路径,仍未解决。原因不明,暂时搁置在这里:
引发了未经处理的异常:读取访问权限冲突。
this->m_ptr->**ob_type** 是 0xffffffffffffffe7。
到此这篇关于c++/python混合编程之小结pybind11的使用的文章就介绍到这了,更多相关pybind11 c++混合编程python 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
推荐阅读
-
一文教你Python如何快速精准抓取网页数据
本文将使用requests和beautifulsoup这两个流行的库来实现。1.准备工作首先安装必要的库:pipinst...
-
使用Python实现IP地址和端口状态检测与监控
-
基于Python打造一个智能单词管理神器
-
Python实现微信自动锁定工具
-
使用Python创建一个功能完整的Windows风格计算器程序
python实现windows系统计算器程序(含高级功能)下面我将介绍如何使用python创建一个功能完整的windows风格计...
-
Python开发文字版随机事件游戏的项目实例
随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型。在这类游戏中,玩家必须应对随机发生的情况,这些情况可能会影响他们的资...
-
使用Pandas实现Excel中的数据透视表的项目实践
引言在数据分析中,数据透视表是一种非常强大的工具,它可以帮助我们快速汇总、分析和可视化大量数据。虽然excel提供了内置的数据透...
-
Pandas利用主表更新子表指定列小技巧
一、前言工作的小技巧,利用pandas读取主表和子表,利用主表的指定列,更新子表的指定列。案例:主表:uidname0...
-
Pandas中统计汇总可视化函数plot()的使用
-
Python中tensorflow的argmax()函数的使用小结
在tensorflow中,argmax()函数是一个非常重要的操作,它用于返回给定张量(tensor)沿指定轴的最大值的索引。这个...