Trang tài liệu
Khóa học C++ nền tảng
Chương 20. Thư viện
Pybind11

Pybind11

Pybind11 là một thư viện chỉ có tiêu đề gọn nhẹ tích hợp liền mạch mã C++ với Python, cho phép người dùng dễ dàng đưa mã code C++11 vào hệ sinh thái Python. Điều này đạt được bằng cách cung cấp các liên kết Python có thể tương tác với các hàm và lớp được viết bằng C++. Nó cung cấp một API tương tự như thư viện Boost.Python nhưng yêu cầu ít mã hơn, do đó mang lại hiệu suất tốt hơn.

Pybind11 giúp tạo các phần mở rộng thư viện, đưa mã code C++ hiệu suất cao vào các chương trình Python và sử dụng tính linh hoạt của Python để phát triển nhanh chóng trong khi vẫn hưởng lợi từ hiệu quả của C++.

Ví dụ mã code

Dưới đây là một số ví dụ về Pybind11 để hiểu rõ hơn về khái niệm này:

  • Hiển thị hàm C++ cho Python:
    #include <pybind11/pybind11.h>
     
    int add(int a, int b) {
        return a + b;
    }
     
    PYBIND11_MODULE(example, m) {
        m.def("add", &add, "A function that adds two numbers");
    }

Chạy ví dụ trên sẽ tạo một mô-đun Python có tên là ví dụ, chứa một hàm duy nhất là add. Bạn có thể sử dụng hàm mới này trong Python như sau:

import example
 
result = example.add(1, 2)
print(result)  # Output: 3
  • Hiển thị một lớp C++ với Python:
    #include <pybind11/pybind11.h>
     
    namespace py = pybind11;
     
    class MyTestClass {
    public:
        MyTestClass(const std::string &name) : name_(name) { }
     
        const std::string &name() const { return name_; }
        void setName(const std::string &name) { name_ = name; }
     
    private:
        std::string name_;
    };
     
    PYBIND11_MODULE(example, m) {
        py::class_<MyTestClass>(m, "MyTestClass")
            .def(py::init<const std::string &>())
            .def("name", &MyTestClass::name)
            .def("setName", &MyTestClass::setName);
    }

Sau khi biên dịch mã code và nhập nó vào Python, bạn có thể tạo các phiên bản MyTestClass và gọi các phương thức name() và setName(string) của chúng:

import example
 
obj = example.MyTestClass("some_name")
print(obj.name())  # Output: some_name
 
obj.setName("new_name")
print(obj.name())  # Output: new_name