0Pricing
C++ Academy · Lezione

Chiamare Python da C++ con pybind11

Avvolga il codice C++ in un modulo Python usando pybind11

Chiamare Python da C++ con pybind11 è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Perché pybind11

pybind11 è una libreria composta solo da header che crea binding Python per codice C++ con una quantità minima di codice ripetitivo. Viene utilizzata da SciPy, TensorFlow e molti altri progetti.

Un modulo minimale

Definite un modulo Python in un singolo file 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");
}

Creare il modulo

Create il modulo come modulo di estensione Python, generalmente con CMake o setuptools.

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

Utilizzarlo da Python

Importatelo e utilizzatelo come qualsiasi modulo Python.

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

Esporre le classi

Utilizzate py::class_ per creare il binding di una classe C++. Costruttori, metodi e proprietà vengono tutti associati agli equivalenti 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);
}

Conversioni dei tipi

pybind11 converte automaticamente i tipi comuni:

  • std::string ↔ str di Python
  • std::vector<T> ↔ list di Python
  • std::map ↔ dict di Python
  • Tipi numerici ↔ int/float di Python

Interoperabilità con NumPy

Passate gli array NumPy come py::array_t<T>. Accedete al buffer per eseguire operazioni senza copia.

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

Lambda come binding

Associate direttamente una lambda quando volete trasformare gli argomenti o racchiudere un comportamento.

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

Rilasciare il GIL

Per i calcoli C++ di lunga durata, rilasciate il GIL in modo che gli altri thread Python possano essere eseguiti.

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

Prestazioni

pybind11 aggiunge un overhead minimo, generalmente di alcune centinaia di nanosecondi per chiamata. È trascurabile per le funzioni non banali, ma diventa rilevante nei cicli stretti con funzioni chiamate dal costo ridotto.

Alternative

Altri bridge tra Python e C++:

  • Boost.Python — più datato e pesante
  • SWIG — supporta molti linguaggi
  • nanobind — più recente e veloce di pybind11

Casi d'uso reali

pybind11 è ideale per:

  • Racchiudere una libreria C++ per gli utenti Python
  • Velocizzare i percorsi critici di Python con codice C++
  • Condividere kernel numerici tra applicazioni C++ e strumenti Python

Verifica rapida

Quale macro utilizza pybind11 per dichiarare un modulo Python?

Riepilogo

pybind11 rende quasi automatico il wrapping del C++ per Python. Dichiarate i moduli con PYBIND11_MODULE, create il binding delle funzioni con m.def e delle classi con py::class_. Le conversioni integrate coprono i tipi STL; gli array NumPy vengono gestiti senza copia.

Domande Frequenti

La lezione «Chiamare Python da C++ con pybind11» è gratuita?

Sì — il testo completo di «Chiamare Python da C++ con pybind11» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Chiamare Python da C++ con pybind11»?

Avvolga il codice C++ in un modulo Python usando pybind11 Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Chiamare Python da C++ con pybind11»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. extern C e ABI C
  2. Chiamare Python da C++ con pybind11
  3. C++ per i confini FFI con Rust
  4. Usare SWIG per binding multilingua
← Torna a C++ Academy