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
helloje ime Python modulamje 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_helloje 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:
- »Prava« C++ koda živi v vaših glavi/datotekah.
- Vezavna datoteka te glave vključi.
- 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.