pybind11基本用法

发布时间 2023-06-17 11:36:03作者: 夏蝉沐雪

1、头文件和命名空间约定

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

2、函数绑定

`PYBIND11_MODULE`会创建一个函数,它在Python中使用`import`语句时被调用。宏的第一个参数是模块名(example),不使用引号包住;第二个参数是类型为`py::module_`的变量(m),它是创建绑定的主要接口。`module_::def()`方法,则会生成add函数的Python绑定代码。

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring
    m.def("add", &add, "A function which adds two numbers");
}

python
>>> import example
>>> example.add(1, 2)

3、关键字参数

arg是可用于将元数据传递到module::def()的几个特殊标记类之一。使用后可以在调用函数时使用关键字参数,以增加代码可读性,特别是对那些带有多个参数的函数。后缀`_a`会生成一个等价于`arg`方法的字面量。

m.def("add", &add, "A function which adds two numbers", py::arg("i"), py::arg("j"));
//m.def("add2", &add, "i"_a, "j"_a); 简短写法

python
import example
example.add(i=1, j=2)

4、默认参数

pybind11不能自动地提取默认参数,因为它不属于函数类型信息的一部分。我们需要借助`arg`来实现这一功能:

int add(int i = 1, int j = 2) {
    return i + j;
}

m.def("add", &add, "A function which adds two numbers",
      py::arg("i") = 1, py::arg("j") = 2);

5、导出变量

使用`attr`函数来注册需要导出到Python模块中的C++变量

PYBIND11_MODULE(example, m) {
    m.attr("the_answer") = 42;
    py::object world = py::cast("World");
    m.attr("what") = world;
}

pyhton
>>> import example
>>> example.the_answer
42
>>> example.what
'World'