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
#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");
}
然后,由于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中定义的模块块名称保持一致。
参考: