本文作者:icy

Pybind11:无缝连接 C++ 与 Python 的桥梁

icy 昨天 11 抢沙发
Pybind11:无缝连接 C++ 与 Python 的桥梁摘要: Pybind11:无缝连接 C++ 与 Python 的桥梁 项目概述 Pybind11 是一个轻量级的 C++ 库,专门用于在 Python 中创建 C++ 代码的绑定。它允许开...

Pybind11:无缝连接 C++ 与 Python 的桥梁

Pybind11:无缝连接 C++ 与 Python 的桥梁

项目概述

Pybind11 是一个轻量级的 C++ 库,专门用于在 Python 中创建 C++ 代码的绑定。它允许开发者将 C++ 代码暴露给 Python,使得高性能的 C++ 库能够被 Python 程序轻松调用,同时保持了 Python 的简洁性和易用性。

核心特性

1. 简洁的 API 设计

Pybind11 采用了现代 C++(C++11 及以上)的特性,提供了简洁直观的 API,大大减少了编写绑定的代码量。

2. 自动类型转换

支持 C++ 和 Python 之间的自动类型转换,包括基本类型、STL 容器、自定义类等。

3. 零开销抽象

生成的绑定代码几乎没有任何运行时开销,性能接近直接调用 C++ 函数。

4. 跨平台支持

支持 Windows、Linux 和 macOS 等主流操作系统。

安装与配置

安装方式

text
# 使用 pip 安装
pip install pybind11

# 或者使用 conda
conda install -c conda-forge pybind11

CMake 集成

text
find_package(pybind11 REQUIRED)
pybind11_add_module(example example.cpp)

基础使用示例

示例 1:基本函数绑定

text
#include <pybind11/pybind11.h>

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

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 示例插件";
    m.def("add", &add, "两个整数相加");
}

编译后可以在 Python 中直接调用:

text
import example
result = example.add(1, 2)  # 返回 3

示例 2:类绑定

text
#include <pybind11/pybind11.h>
#include <string>

namespace py = pybind11;

class Pet {
public:
    Pet(const std::string &name) : name(name) { }
    
    void setName(const std::string &name_) { name = name_; }
    const std::string &getName() const { return name; }
    
private:
    std::string name;
};

PYBIND11_MODULE(example, m) {
    py::class_<Pet>(m, "Pet")
        .def(py::init<const std::string &>())
        .def("setName", &Pet::setName)
        .def("getName", &Pet::getName)
        .def("__repr__",
            [](const Pet &a) {
                return "<example.Pet named '" + a.getName() + "'>";
            }
        );
}

Python 中使用:

text
import example

pet = example.Pet("Molly")
print(pet.getName())  # 输出: Molly
pet.setName("Charly")
print(pet)  # 输出: <example.Pet named 'Charly'>

示例 3:STL 容器支持

text
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <string>

namespace py = pybind11;

std::vector<std::string> process_data(const std::vector<int>& data) {
    std::vector<std::string> result;
    for (int num : data) {
        result.push_back("Value: " + std::to_string(num));
    }
    return result;
}

PYBIND11_MODULE(example, m) {
    m.def("process_data", &process_data, "处理整数数组");
}

Python 中使用:

text
import example

data = [1, 2, 3, 4, 5]
result = example.process_data(data)
print(result)  # 输出: ['Value: 1', 'Value: 2', ...]

高级特性

NumPy 数组支持

Pybind11 提供了对 NumPy 数组的原生支持:

text
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>

namespace py = pybind11;

py::array_t<double> add_arrays(py::array_t<double> input1, 
                               py::array_t<double> input2) {
    auto buf1 = input1.request();
    auto buf2 = input2.request();
    
    if (buf1.size != buf2.size) {
        throw std::runtime_error("输入数组大小必须相同");
    }
    
    auto result = py::array_t<double>(buf1.size);
    auto buf3 = result.request();
    
    double *ptr1 = static_cast<double *>(buf1.ptr);
    double *ptr2 = static_cast<double *>(buf2.ptr);
    double *ptr3 = static_cast<double *>(buf3.ptr);
    
    for (size_t i = 0; i < buf1.size; i++) {
        ptr3[i] = ptr1[i] + ptr2[i];
    }
    
    return result;
}

PYBIND11_MODULE(numpy_example, m) {
    m.def("add_arrays", &add_arrays, "两个 NumPy 数组相加");
}

多线程支持

text
#include <pybind11/pybind11.h>
#include <thread>
#include <vector>

void parallel_computation(int n) {
    std::vector<std::thread> threads;
    
    for (int i = 0; i < n; ++i) {
        threads.emplace_back([i]() {
            // 执行计算任务
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        });
    }
    
    for (auto& t : threads) {
        t.join();
    }
}

PYBIND11_MODULE(thread_example, m) {
    m.def("parallel_computation", &parallel_computation, 
          "并行计算示例");
}

实际应用场景

1. 性能关键代码加速

将计算密集型的算法用 C++ 实现,通过 Pybind11 暴露给 Python 调用。

2. 现有 C++ 库的 Python 封装

为现有的 C++ 库创建 Python 接口,使其能够被 Python 生态系统使用。

3. 混合编程项目

在同一个项目中同时使用 C++ 的高性能和 Python 的开发效率。

最佳实践建议

  1. 错误处理:合理使用异常处理,确保 Python 端能收到有意义的错误信息
  2. 内存管理:注意对象的生命周期管理,避免内存泄漏
  3. 文档注释:为绑定的函数和类添加清晰的文档字符串
  4. 版本兼容:考虑不同 Python 版本和 C++ 标准的兼容性

总结

Pybind11 为 C++ 和 Python 之间的互操作提供了一个高效、简洁的解决方案。无论是将现有的 C++ 库暴露给 Python,还是在 Python 项目中集成高性能的 C++ 模块,Pybind11 都是一个优秀的选择。其简洁的 API 设计和强大的功能使得混合编程变得更加容易,让开发者能够充分利用两种语言的优势。

通过本文介绍的基础示例和高级特性,开发者可以快速上手 Pybind11,并在实际项目中应用这一强大的工具。

pybind11_20260205125347.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/2026/03/428.html发布于 昨天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,11人围观)参与讨论

还没有评论,来说两句吧...