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)) # 5Esporre 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 Pythonstd::vector<T>↔ list di Pythonstd::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
- extern C e ABI C
- Chiamare Python da C++ con pybind11
- C++ per i confini FFI con Rust
- Usare SWIG per binding multilingua