pybind11简介(1)


当我阅读Open3D和Dlib的源代码时,我使用了一个名为pybind11的好东西制作了一个Python库,因此我尝试了一下。

准备

使用

cmake。 pybind11是一个只有标头的库,可以从github(https://github.com/pybind/pybind11/releases)等下载,并按以下目录布局进行排列。

1
2
3
4
project top
|- CMakeLists.txt
|- pybind11/
|- mymodule.cpp

源代码

mymodule.cpp中编写以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
#include <pybind11/pybind11.h>

int add(int a, int b)
{
    return a + b;
}

PYBIND11_MODULE(mymodule, m)
{
    m.doc() = "my test module";
    m.def("add", &add, "add two numbers");
}

您可以使用宏

PYBIND11_MODULE创建Python模块。第一个参数mymodule必须是模块的名称,并与最终将创建的库的文件名匹配。 (对于mymodule.cpython-37m-x86_64-linux-gnu.so之类的名称,为mymodule)

第二个参数m仅在宏中使用,并且您可以使用m.def来注册函数。

构建此文件时,按如下所示创建CMakeLists.txt

1
2
3
4
5
cmake_minimum_required(VERSION 3.2)
project(pybind_test VERSION 0.1.0)

add_subdirectory(pybind11)
pybind11_add_module(mymodule mymodule.cpp)

如果按原样构建,将使用默认的Python。如果要针对使用vritualenv或conda创建的特定版本的Python环境进行构建,请提前激活该环境或指定cmake -DPYTHON_EXECUTABLE=path/to/python ..。如果在Linux上针对Python 3.7进行构建,则将获得一个名为mymodule.cpython-37m-x86_64-linux-gnu.so的文件。您可以通过将其放置在可以使用PYTHONPATH的位置(例如,当前目录)中来导入它。

1
2
3
import mymodule
mymodule.add(1, 10)
>> 11

分割源文件

当项目扩展或要使用原始C / C代码时,不能在mymodule.cpp中编写所有代码。要将源代码分为多个部分,请执行以下操作。

1
2
3
4
5
6
project top
|- CMakeLists.txt
|- pybind11/
|- mymodule.cpp
|- lib.cpp
|- lib.hpp

lib.hpp

1
int add(int a, int b);

库文件

1
2
3
4
5
6
#include "lib.hpp"

int add(int a, int b)
{
    return a + b;
}

mymodule.cpp

1
2
3
4
5
6
7
8
#include <pybind11/pybind11.h>
#include "lib.hpp"

PYBIND11_MODULE(mymodule, m)
{
    m.doc() = "my test module";
    m.def("add", &add, "add two numbers");
}

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
cmake_minimum_required(VERSION 3.2)
project(pybind_test VERSION 0.1.0)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

add_subdirectory(pybind11)

add_library(test lib.cpp)

pybind11_add_module(mymodule mymodule.cpp)
target_link_libraries(mymodule PRIVATE test)

点使用add_library创建与Python无关的库,然后将其与在target_link_libraries中使用pybind11创建的模块组合。当然,您可以使用pybind11_add_module指定所有源文件,但是我认为这更方便,因为您可以创建普通的C / C库和Python库。

参考

官方文档:https://pybind11.readthedocs.io/en/stable/index.html