在一些负责的项目工程中,我们可能会使用到不同语言进行功能/服务的搭建,其中Python由于其简单易用的特点,在一些微架构的情况下会被采用,而使用Python如何去调用项目中C++编写的工程呢?Pybind11会是一个好的选择。
pybind是一个用于将 C++ 和 Python 无缝结合的库,它使得开发者能够轻松地创建高性能的 Python 绑定(bindings)以调用 C++ 代码。pybind 是在 Boost.Python的基础上发展起来的,旨在提供更现代、更易用的接口来简化绑定的编写过程。
主要特点
1. 易用性:pybind11提供了直观的 API 来注册 C++ 类型到 Python,并支持类型推断等特性,减少了绑定代码的手动编写工作量。
2. 性能:通过直接操作 Python 对象和使用高效的 C++ 技术,pybind11 能够实现接近原生 C++ 性能的 Python 绑定。
3. 兼容性:它与现有的基于 SWIG 或 Boost.Python 的绑定代码兼容良好,并且可以与 NumPy 等 C 扩展模块一起使用。
4. 扩展性:由于它的设计灵活,因此很容易扩展 pybind11以支持更多的 C++ 特性或改进现有功能。
5. 社区支持:pybind11拥有一个活跃的开发者社区,这有助于持续改进和错误修复。
使用场景
当你需要从 Python 中访问 C++ 代码时,比如为了提高性能或复用已有的 C++ 库。
当你想为现有的 C++ 项目提供 Python 接口时。
当你需要编写同时支持 C++ 和 Python 的代码时。
安装和使用
使用pip可以直接安装:
pip install pybind11
采用cmake构建的示例:
set(PYTHON_TARGET_VER 3.6)
find_package(PythonInterp ${PYTHON_TARGET_VER} EXACT)
find_package(PythonLibs ${PYTHON_TARGET_VER} EXACT REQUIRED)
include_directories(pybind11_include_path)
include_directories(${PYTHON_INCLUDE_DIRS})
C++代码中绑定函数:
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");
}
宏PYBIND11_MODULE会创建模块初始化函数,它在Python中import模块时被调用。其参数分别是模块名,类型为py::module_的变量(m),是创建绑定的主要接口。module_::def()方法,可以生成函数的绑定。
Python代码中直接调用:
import example
example.add(i=1, j=2)
学习网站
更多复杂用法可以参考:
pybind11开源代码:https://github.com/pybind/pybind11
中文文档:https://geekdaxue.co/read/pybind11-CN/summary.md