0Pricing
C++ Academy · Lección

Llamar a Python desde C++ mediante pybind11

Envuelva código C++ como un módulo de Python usando pybind11.

Llamar a Python desde C++ mediante pybind11 es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

¿Por qué pybind11?

pybind11 es una biblioteca formada únicamente por cabeceras que crea bindings de Python para código C++ con un mínimo de código repetitivo. La utilizan SciPy, TensorFlow y muchos otros proyectos.

Un módulo mínimo

Defina un módulo de Python en un único archivo con la macro 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");
}

Compilar el módulo

Compile como un módulo de extensión de Python, normalmente con CMake o setuptools.

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

Usar desde Python

Impórtelo y utilícelo como cualquier módulo de Python.

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

Exponer clases

Utilice py::class_ para enlazar una clase de C++. Los constructores, métodos y propiedades se corresponden con sus equivalentes en 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);
}

Conversiones de tipos

pybind11 convierte automáticamente los tipos habituales:

  • std::string ↔ Python str
  • std::vector<T> ↔ Python list
  • std::map ↔ Python dict
  • Tipos numéricos ↔ Python int/float

Interoperabilidad con NumPy

Pase matrices de NumPy como py::array_t<T>. Acceda al búfer para realizar operaciones sin copias.

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;
}

Lambdas como bindings

Enlace una lambda directamente cuando quiera transformar argumentos o envolver un comportamiento.

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

Liberar el GIL

Para cálculos largos en C++, libere el GIL para que puedan ejecutarse otros hilos de Python.

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

Rendimiento

pybind11 añade una sobrecarga mínima, normalmente de unos cientos de nanosegundos por llamada. Es insignificante para funciones no triviales, pero importa en bucles estrechos con funciones llamadas de bajo coste.

Alternativas

Otros puentes entre Python y C++:

  • Boost.Python: más antiguo y pesado
  • SWIG: admite muchos lenguajes
  • nanobind: más reciente y rápido que pybind11

Casos de uso reales

pybind11 es ideal para:

  • Envolver una biblioteca de C++ para usuarios de Python
  • Acelerar rutas críticas de Python con código C++
  • Compartir kernels numéricos entre aplicaciones de C++ y herramientas de Python

Comprobación rápida

¿Qué macro utiliza pybind11 para declarar un módulo de Python?

Resumen

pybind11 hace que envolver C++ para Python sea casi sencillo. Declare módulos con PYBIND11_MODULE, enlace funciones con m.def y clases con py::class_. Las conversiones integradas cubren los tipos de la STL; las matrices de NumPy se manejan sin copias.

Preguntas frecuentes

¿La lección «Llamar a Python desde C++ mediante pybind11» es gratis?

Sí — el texto completo de «Llamar a Python desde C++ mediante pybind11» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Llamar a Python desde C++ mediante pybind11»?

Envuelva código C++ como un módulo de Python usando pybind11. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Llamar a Python desde C++ mediante pybind11»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. extern C y la ABI de C
  2. Llamar a Python desde C++ mediante pybind11
  3. C++ para fronteras FFI con Rust
  4. Uso de SWIG para bindings multilingües
← Volver a C++ Academy