Skoči na vsebino

Vsebina

Ta modul uporablja:

  • https://github.com/leskovec/pyC_intro

Osrednja ideja je, da projekt pybind11 vsebuje majhno vezavno datoteko (binding file), ki Pythonu pove, katere C++ funkcije (kasneje tudi razrede) lahko kliče.

Minimalna pybind11 vezavna datoteka

Spodaj je zelo preprost primer pybind11 datoteke. S prevajanjem dobimo deljeno knjižnico, ki jo Python lahko uvozi kot modul (tu: hello).

#include <pybind11/pybind11.h>

#include "hello.h"

PYBIND11_MODULE(hello, m) {
    m.doc() = "pybind11 hello plugin";
    m.def("say_hello", &say_hello, "A function which says hello");
}

Poglejmo vrstico za vrstico, ker je tu zajet celoten »most« med C++ in Pythonom.

1) Glava pybind11

#include <pybind11/pybind11.h>

To je osrednji vmesnik pybind11. Zagotovi:

  • makro PYBIND11_MODULE(...) (vstopna točka modula ob uvozu)
  • C++ tipe za predstavitev Python objektov (npr. objekt modula m)
  • registracijske pomožne funkcije, kot je m.def(...)

Konceptualno: ta glava vam da orodje, da iz C++ sestavite Python modul.

2) Vaša C++ koda ostane običajen C++

#include "hello.h"

To je pogosto spregledana, a pomembna točka: funkcija, ki jo izpostavite (tu say_hello), živi v vaši glavi in ostane navadna C++ koda. V realni raziskovalni kodi računske rutine navadno že obstajajo. pybind11 je samo tanek sloj, ki izbrane rutine izpostavi v Python.

3) Vstopna točka modula

PYBIND11_MODULE(hello, m) { ... }

Ta makro definira inicializacijsko funkcijo, ki jo Python pokliče, ko zaženete:

import hello
  • hello je ime Python modula
  • m je objekt modula, ki ga napolnite s funkcijami, razredi, konstantami itd.

Berite tako: »Ko Python uvozi hello, ustvari modul m in vanj registriraj vsebino.«

4) m.doc() nastavi dokumentacijski niz modula

m.doc() = "pybind11 hello plugin";

Python moduli imajo docstring, enako kot funkcije. Če nastavite m.doc(), je interaktivna raba prijetnejša:

import hello
print(hello.__doc__)
help(hello)

Na delavnici je to tudi hiter preizkus, da ste res uvozili pravi modul.

5) m.def(...) izpostavi C++ funkcijo v Pythonu

m.def("say_hello", &say_hello, "A function which says hello");

Ta vrstica registrira Pythonu vidno funkcijo:

  • "say_hello" je ime, ki ga kliče uporabnik v Pythonu: hello.say_hello()
  • &say_hello je kazalec na C++ funkcijo
  • zadnji niz je docstring funkcije, prikazan z help(hello.say_hello)

Ko Python pokliče hello.say_hello(), pybind11 pretvori Python argumente (če obstajajo) v C++ vrednosti, pokliče C++ funkcijo in povratno vrednost pretvori nazaj v Python objekt.

Kaj se ta primer v resnici uči

Čeprav je primer majhen, vsebuje celoten vzorec, ki ga boste ponavljali skozi delavnico:

  1. »Prava« C++ koda živi v vaših glavi/datotekah.
  2. Vezavna datoteka te glave vključi.
  3. Vse, kar vidi Python, registrirate znotraj PYBIND11_MODULE.

Ko je to jasno, ostalo ni več mistično: pišete »registracijsko kodo« in načrtujete API, ki je prijazen Python uporabniku.