0Pricing
C++ Academy · Урок

Вызов Python из C++ через pybind11

Оборачивайте код C++ в модуль Python с помощью pybind11.

«Вызов Python из C++ через pybind11» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Зачем нужен pybind11

pybind11 — библиотека, состоящая только из заголовочных файлов, которая создаёт привязки Python для кода C++ с минимальным количеством шаблонного кода. Её используют SciPy, TensorFlow и многие другие проекты.

Минимальный модуль

Определите модуль Python в одном файле с помощью макроса PYBIND11_MODULE.

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

int add(int a, int b) { return a + b; }

PYBIND11_MODULE(mymodule, m) {
    m.def("add", &add, "Add two integers");
}

Сборка модуля

Соберите модуль расширения Python — обычно с помощью CMake или setuptools.

# CMake
find_package(pybind11 REQUIRED)
pybind11_add_module(mymodule mymodule.cpp)

Использование из Python

Импортируйте модуль и используйте его как любой другой модуль Python.

# Python
import mymodule
print(mymodule.add(2, 3))   # 5

Предоставление классов

Используйте py::class_ для привязки класса C++. Конструкторы, методы и свойства сопоставляются с эквивалентами в Python.

class Point {
public:
    Point(int x, int y) : x_(x), y_(y) {}
    int x() const { return x_; }
    int y() const { return y_; }
private:
    int x_, y_;
};

PYBIND11_MODULE(geom, m) {
    py::class_<Point>(m, "Point")
        .def(py::init<int, int>())
        .def("x", &Point::x)
        .def("y", &Point::y);
}

Преобразование типов

pybind11 автоматически преобразует распространённые типы:

  • std::string ↔ строка Python
  • std::vector<T> ↔ список Python
  • std::map ↔ словарь Python
  • Числовые типы ↔ int/float Python

Совместимость с NumPy

Передавайте массивы NumPy как py::array_t<T>. Для операций без копирования обращайтесь к буферу.

void scale(py::array_t<double> arr, double factor) {
    auto buf = arr.mutable_unchecked<1>();
    for (size_t i = 0; i < buf.size(); ++i)
        buf(i) *= factor;
}

Лямбда-выражения как привязки

Создавайте привязку непосредственно из лямбда-выражения, если нужно преобразовать аргументы или обернуть поведение.

m.def("show", [](const Point& p) {
    return "(" + std::to_string(p.x()) + ", " + std::to_string(p.y()) + ")";
});

Освобождение GIL

При длительных вычислениях на C++ освобождайте GIL, чтобы другие потоки Python могли выполняться.

m.def("slow", []() {
    py::gil_scoped_release release;
    // expensive C++ work, no Python access
});

Производительность

pybind11 добавляет минимальные накладные расходы — обычно несколько сотен наносекунд на вызов. Для нетривиальных функций это несущественно, но имеет значение в тесных циклах с быстро выполняемыми вызываемыми функциями.

Альтернативы

Другие средства связи Python и C++:

  • Boost.Python — более старое и тяжёлое решение
  • SWIG — поддерживает множество языков
  • nanobind — более новое и быстрое решение, чем pybind11

Практические сценарии использования

pybind11 особенно хорошо подходит для:

  • создания обёртки над библиотекой C++ для пользователей Python
  • ускорения критичных участков Python с помощью кода C++
  • совместного использования числовых ядер приложениями на C++ и инструментами Python

Быстрая проверка

Какой макрос pybind11 использует для объявления модуля Python?

Итоги

pybind11 почти без усилий позволяет создавать обёртки C++ для Python. Объявляйте модули с помощью PYBIND11_MODULE, привязывайте функции через m.def, а классы — через py::class_. Встроенные преобразования охватывают типы STL; массивы NumPy передаются без копирования.

Часто задаваемые вопросы

Урок «Вызов Python из C++ через pybind11» бесплатный?

Да — полный текст урока «Вызов Python из C++ через pybind11» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вызов Python из C++ через pybind11»?

Оборачивайте код C++ в модуль Python с помощью pybind11. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Вызов Python из C++ через pybind11»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Extern C и ABI языка C
  2. Вызов Python из C++ через pybind11
  3. C++ для границ FFI Rust
  4. Использование SWIG для привязок нескольких языков
← Назад к C++ Academy