• pybind11 连接C++11和Python


    pybind11是一个轻量级的头文件库,它在Python中暴露了C++类型和方法,反之也可以在C++中使用Python方法,主要用于创建现有C++代码的Python绑定。这里简单介绍在win10系统使用vs2019编译器实现绑定C++函数到Python接口。

    例如,如下使用C++实现一个加法:

    int add(int i, int j) {
        printf("load c++ add: \n");
        return i + j;
    }
    
    • 1
    • 2
    • 3
    • 4

    然后,想通过Python进行如下调用:

    import CFunc
    print(CFunc.add(1,2))
    
    • 1
    • 2

    预期的执行结果如下:

    load c++ add:
    5
    
    • 1
    • 2

    这里简要介绍如何使用pybind11在Windows 10系统下对C++代码进行封装。

    首先,对C++方法进行接口封装: 即使用PYBIND11_MODULE宏

    //add.cpp
    #include 
    #include 
    namespace py = pybind11;
     
    int add(int i, int j) {
        printf("load c++ add: \n");
        return i + j;
    }
    //CFunc是包的名称,add是包中函数的名称
    //PYBIND11_MODULE是一个宏,m是py::module类型
    PYBIND11_MODULE(CFunc, m) {
        m.doc() = "pybind11 example plugin"; // optional module docstring
     
        m.def("add", &add, "A function which adds two numbers");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然后,由于C++源码依赖pybind11.h,需要下载pybind源码, 下载地址为:https://github.com/pybind/pybind11 。将pybind11文件夹放在C++文件同一个目录下。

    接着,使用CMake工具对C++进行编译。 这里需要一个CMakeLists.txt文件。内容如下:

    cmake_minimum_required(VERSION 3.4.3)
    project(CFunc)
    
    find_package(Python COMPONENTS Interpreter Development REQUIRED)
    add_subdirectory(pybind11)
    
    pybind11_add_module(CFunc add.cpp)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里将pybind11文件夹作为子目录加载到项目中。整体的文件目录结构如下:
    在这里插入图片描述
    其中,build文件夹是CMake的编译目录目录,add.cpp是C++源码,test_add.py是测试代码:

    import CFunc
    CFunc.add(2,3)
    
    • 1
    • 2

    CMake的配置方法可以参考其他资料,如下是成功生成VS2019解决方案的结果。
    在这里插入图片描述
    在build文件夹目录下保存了VS2019的sln工程文件:CFunc.sln
    在这里插入图片描述
    接着,使用vs2019编译生成对应的库文件CFunc.cp38-win_amd64.pyd

    已启动生成…
    1>------ 已启动生成: 项目: CFunc, 配置: Release x64 ------
    1>add.cpp
    1>  正在创建库 H:/MindSpore/demo/pybind11/build/Release/CFunc.lib 和对象 H:/MindSpore/demo/pybind11/build/Release/CFunc.exp
    1>正在生成代码
    1>已完成代码的生成
    1>CFunc.vcxproj -> H:\MindSpore\demo\pybind11\build\Release\CFunc.cp38-win_amd64.pyd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    最后,将CFunc.cp38-win_amd64.pyd文件 与前面提到的test_add.py文件放置同一个目录下,然后测试结果:
    在这里插入图片描述

    需要注意的是,最后生成的文件CFunc.cp38-win_amd64.pyd,其名称CFunc 需要与在C++源码PYBIND11_MODULE中定义的模块块名称保持一致。

    参考:

    1. Building with CMake,https://pybind11.readthedocs.io/en/stable/compiling.html#building-manually
    2. https://github.com/pybind/pybind11
    3. https://zhuanlan.zhihu.com/p/192974017
  • 相关阅读:
    Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序
    电脑技巧:推荐八个实用的在线学习网站
    2分钟讲清楚C#的委托, C语言的函数指针,Java的函数式接口
    Java 注解及其底层原理
    《自动驾驶感知算法实战专栏(源代码)》专栏概述 | 实战教程,开放源码
    Server-Sent Events(以下简称 SSE)及event-source-polyfill使用
    Vue | Vue 核心 +
    减少延迟时间的方法
    自动化运维?看看Python怎样完成自动任务调度 ⛵
    Cocos2d-x 3D渲染技术 (一)
  • 原文地址:https://blog.csdn.net/liujiabin076/article/details/127626054