Вызов 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↔ строка Pythonstd::vector<T>↔ список Pythonstd::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 — локальная установка не требуется.
Все уроки этого курса
- Extern C и ABI языка C
- Вызов Python из C++ через pybind11
- C++ для границ FFI Rust
- Использование SWIG для привязок нескольких языков