C++ Academy · Lektion

Kald Python fra C++ via pybind11

Indpak C++-kode som et Python-modul med pybind11

Lektion 2 af 414 trin

Kald Python fra C++ via pybind11 er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvorfor pybind11?

pybind11 er et bibliotek, der kun består af headerfiler, og som opretter Python-bindinger til C++-kode med et minimum af standardkode. Det bruges af SciPy, TensorFlow og mange andre projekter.

Et minimalt modul

Definér et Python-modul i en enkelt fil med makroen 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");
}

Bygning af modulet

Byg det som et Python-udvidelsesmodul — normalt med CMake eller setuptools.

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

Brug fra Python

Importér og brug det som ethvert andet Python-modul.

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

Eksponering af klasser

Brug py::class_ til at binde en C++-klasse. Konstruktører, metoder og egenskaber mappes alle til tilsvarende elementer i 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);
}

Typekonverteringer

pybind11 konverterer almindelige typer automatisk:

  • std::string ↔ Python str
  • std::vector<T> ↔ Python list
  • std::map ↔ Python dict
  • Numeriske værdier ↔ Python int/float

Interoperabilitet med NumPy

Send NumPy-arrays som py::array_t<T>. Få adgang til bufferen for operationer uden kopiering.

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

Lambdaer som bindinger

Bind en lambda direkte, når du vil transformere argumenter eller indpakke adfærd.

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

Frigivelse af GIL

Ved lange C++-beregninger skal du frigive GIL, så andre Python-tråde kan køre.

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

Ydeevne

pybind11 tilføjer et minimalt overhead — normalt et par hundrede nanosekunder pr. kald. Det er ubetydeligt for funktioner, der udfører reelt arbejde, men har betydning i tætte løkker med billige kaldte funktioner.

Alternativer

Andre broer mellem Python og C++:

  • Boost.Python — ældre og tungere
  • SWIG — understøtter mange sprog
  • nanobind — nyere og hurtigere end pybind11

Praktiske anvendelsesområder

pybind11 er ideelt til:

  • At indpakke et C++-bibliotek til Python-brugere
  • At accelerere kritiske kodeveje i Python med C++-kode
  • At dele numeriske kerner mellem C++-programmer og Python-værktøjer

Hurtigt tjek

Hvilken makro bruger pybind11 til at deklarere et Python-modul?

Opsummering

pybind11 gør det næsten ubesværet at indpakke C++ til Python. Deklarér moduler med PYBIND11_MODULE, bind funktioner med m.def og klasser med py::class_. Indbyggede konverteringer dækker STL-typer, og NumPy-arrays kan bruges uden kopiering.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Kald Python fra C++ via pybind11” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Kald Python fra C++ via pybind11”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Kald Python fra C++ via pybind11”?

Indpak C++-kode som et Python-modul med pybind11 Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Kald Python fra C++ via pybind11”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Extern C og C-ABI'en
  2. Kald Python fra C++ via pybind11
  3. C++ til Rust-FFI-grænseflader
  4. Brug af SWIG til bindinger til flere sprog
← Tilbage til C++ Academy