C++/Python混合编程之小结Pybind11的使用

 更新时间:2025年05月07日 10:26:29   作者:为时不晚L  
Pybind11是一个轻量级的C++库,用于将你的C++代码暴露给Python调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、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 clone GitHub - 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关于拓扑排序知识点讲解

    Python关于拓扑排序知识点讲解

    在本篇文章里小编给大家分享了一篇关于Python关于拓扑排序知识点讲解内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • pycharm下打开、执行并调试scrapy爬虫程序的方法

    pycharm下打开、执行并调试scrapy爬虫程序的方法

    本篇文章主要介绍了pycharm下打开、执行并调试scrapy爬虫程序的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • PyQt6/PySide6中QTreeView类的实现

    PyQt6/PySide6中QTreeView类的实现

    QTreeView是PyQt6或PySide6库中用于显示分层数据的控件,本文主要介绍了PyQt6/PySide6中QTreeView类的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • python列表生成器迭代器实例解析

    python列表生成器迭代器实例解析

    这篇文章主要介绍了python列表生成器迭代器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Python使用Spire.XLS for Python轻松实现将Excel转换为PDF

    Python使用Spire.XLS for Python轻松实现将Excel转换为PDF

    在许多商务工作流程中,Excel 文件常用于存储和分析数据,然而,在共享报告或发票时,将其转换为 PDF 能确保内容在不同设备上保持固定和可读,下面我们就来看看如何使用Python实现Excel到PDF的转换吧
    2025-11-11
  • pytorch 如何在GPU上训练

    pytorch 如何在GPU上训练

    这篇文章主要介绍了pytorch 如何在GPU上训练的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • python基于win32api实现键盘输入

    python基于win32api实现键盘输入

    这篇文章主要介绍了python基于win32api实现键盘输入,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • 基于matplotlib中ion()和ioff()的使用详解

    基于matplotlib中ion()和ioff()的使用详解

    这篇文章主要介绍了基于matplotlib中ion()和ioff()的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 一文详解Python是如何处理SSH的

    一文详解Python是如何处理SSH的

    SSH是一种网络安全协议,旨在通过加密和认证机制实现安全的访问,远程登录和文件传输等业务,下面小编就来和大家聊聊Python是如何处理SSH的吧
    2025-02-02
  • 关于Matplotlib绘制动态实时曲线的方法改进指南

    关于Matplotlib绘制动态实时曲线的方法改进指南

    这篇文章主要给大家介绍了关于Matplotlib绘制动态实时曲线的相关资料,matplotlib是python里最popular的画图工具,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-06-06

最新评论