0Pricing
C++ Academy · Leçon

Appeler Python depuis C++ avec pybind11

Encapsuler du code C++ sous forme de module Python avec pybind11

Appeler Python depuis C++ avec pybind11 est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.

Pourquoi pybind11 ?

pybind11 est une bibliothèque à en-tête uniquement qui crée des liaisons Python pour du code C++ avec très peu de code répétitif. Elle est utilisée par SciPy, TensorFlow et de nombreux autres projets.

Un module minimal

Définissez un module Python dans un seul fichier avec 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");
}

Construire le module

Construisez-le comme un module d'extension Python, généralement avec CMake ou setuptools.

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

Utiliser depuis Python

Importez-le et utilisez-le comme n'importe quel module Python.

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

Exposer des classes

Utilisez py::class_ pour lier une classe C++. Les constructeurs, les méthodes et les propriétés correspondent tous à des équivalents 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);
}

Conversions de types

pybind11 convertit automatiquement les types courants :

  • std::string ↔ chaîne str Python
  • std::vector<T> ↔ liste Python
  • std::map ↔ dictionnaire Python
  • Types numériques ↔ entiers et flottants Python

Interopérabilité avec NumPy

Transmettez les tableaux NumPy comme py::array_t<T>. Accédez au tampon pour effectuer des opérations sans copie.

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

Fonctions lambda comme liaisons

Liez directement une fonction lambda lorsque vous souhaitez transformer les arguments ou encapsuler un comportement.

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

Libérer le GIL

Pour les calculs C++ longs, libérez le GIL afin que les autres threads Python puissent s'exécuter.

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

Performances

pybind11 ajoute très peu de surcharge, généralement quelques centaines de nanosecondes par appel. C'est négligeable pour les fonctions non triviales, mais cela compte dans les boucles serrées dont les fonctions appelées sont peu coûteuses.

Alternatives

Autres passerelles entre Python et C++ :

  • Boost.Python — plus ancien et plus lourd
  • SWIG — prend en charge de nombreux langages
  • nanobind — plus récent et plus rapide que pybind11

Cas d'utilisation réels

pybind11 est idéal pour :

  • Encapsuler une bibliothèque C++ pour les utilisateurs de Python
  • Accélérer les chemins critiques de Python avec du code C++
  • Partager des noyaux numériques entre des applications C++ et des outils Python

Vérification rapide

Quelle macro pybind11 utilise-t-il pour déclarer un module Python ?

Récapitulatif

pybind11 rend l'encapsulation de C++ pour Python presque triviale. Déclarez les modules avec PYBIND11_MODULE, liez les fonctions avec m.def et les classes avec py::class_. Les conversions intégrées couvrent les types STL ; les tableaux NumPy sont utilisés sans copie.

Questions Fréquemment Posées

La leçon « Appeler Python depuis C++ avec pybind11 » est-elle gratuite ?

Oui — le texte complet de « Appeler Python depuis C++ avec pybind11 » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Appeler Python depuis C++ avec pybind11 » ?

Encapsuler du code C++ sous forme de module Python avec pybind11 Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C++ Academy ?

Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Appeler Python depuis C++ avec pybind11 » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?

Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Extern C et ABI du C
  2. Appeler Python depuis C++ avec pybind11
  3. C++ pour les frontières FFI de Rust
  4. Utiliser SWIG pour des liaisons multilingues
← Retour à C++ Academy