pybind11基本用法
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'