抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

PyBind11实现Python调用C++

我曾经写过一篇SWIG实现Python调用C++的文章,SWIG是一个非常好用的通用工具,可以实现很多语言间的互通,不过最近我发现一个专门为Python和C++设计的库,PyBind11,AI领域貌似更喜欢这个库

PyBind11是一个非常轻量的纯头文件库,可以看作对Boost.Python的简化模仿,这个库要求至少使用C++11、Python 3.6,使用条件相对苛刻,但说实话,对于新项目这个版本要求并不过分

PyBind11有很多优点,我个人比较喜欢将项目嵌入到CMake项目,并使用pip install进行安装

嵌入到CMake项目

1. submodule

首先将PyBind11库作为Submodule添加到项目根目录(你也可以放在其他地方)下的pybind11文件夹

git submodule add https://github.com/pybind/pybind11.git pybind11

2. setup.py

在项目根目录添加一个setup.py文件,便于pip安装

可以基于官方示例修改

3. CMakeList.txt

cmake_minimum_required(VERSION 3.21)
project(pycppstudy LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)

add_subdirectory(pybind11)

file(GLOB_RECURSE HEADERS src/*.h)
file(GLOB_RECURSE SOURCES src/*.cpp)
pybind11_add_module(${PROJECT_NAME} ${HEADERS} ${SOURCES})

核心是通过pybind11_add_module创建库

4. 编写代码

引入pybind11头文件,并编写约定

#include <pybind11/pybind11.h>
namespace py = pybind11;

int add(int i, int j) {
return i + j;
}
// 约定
PYBIND11_MODULE(pycppstudy, m) {
m.doc() = "pybind11 pycppstudy plugin";

m.def("add", &add, "A function that adds two numbers");
}

5. 安装包

在这个项目的外层,输入命令

pip install ./<项目文件夹名>

就会按照自定义的包

卸载包的方式是 pip uninstall <包名>

6. 使用

import pycppstudy
pycppstudy.add(1, 2) # 3

评论