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;
}

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

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

预期的执行结果如下:

load c++ add:
5

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

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

//add.cpp
#include <pybind11/pybind11.h>
#include <cstdlib>
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");
}

然后,由于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)

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

import CFunc
CFunc.add(2,3)

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

最后,将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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值