Wywoływanie Pythona z C++ za pomocą pybind11
Opakuj kod C++ jako moduł Pythona za pomocą pybind11
Wywoływanie Pythona z C++ za pomocą pybind11 to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Dlaczego pybind11
pybind11 to biblioteka składająca się wyłącznie z plików nagłówkowych, która tworzy powiązania z Pythonem dla kodu C++ przy minimalnej ilości kodu pomocniczego. Korzystają z niej SciPy, TensorFlow i wiele innych projektów.
Minimalny moduł
Zdefiniuj moduł Pythona w jednym pliku za pomocą makra 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");
}Budowanie modułu
Zbuduj moduł jako rozszerzenie Pythona — zwykle za pomocą CMake lub setuptools.
# CMake
find_package(pybind11 REQUIRED)
pybind11_add_module(mymodule mymodule.cpp)Używanie z poziomu Pythona
Importuj moduł i używaj go tak jak każdego innego modułu Pythona.
# Python
import mymodule
print(mymodule.add(2, 3)) # 5Udostępnianie klas
Użyj py::class_, aby powiązać klasę C++ z Pythonem. Konstruktory, metody i właściwości mają swoje odpowiedniki w Pythonie.
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);
}Konwersje typów
pybind11 automatycznie konwertuje popularne typy:
std::string↔ Python strstd::vector<T>↔ Python liststd::map↔ Python dict- Typy liczbowe ↔ Python int/float
Interoperacyjność z NumPy
Przekazuj tablice NumPy jako py::array_t<T>. Uzyskaj dostęp do bufora, aby wykonywać operacje bez kopiowania danych.
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;
}Lambdy jako powiązania
Powiąż lambdę bezpośrednio, gdy chcesz przekształcać argumenty lub opakować zachowanie.
m.def("show", [](const Point& p) {
return "(" + std::to_string(p.x()) + ", " + std::to_string(p.y()) + ")";
});Zwalnianie GIL
W przypadku długotrwałych obliczeń w C++ zwolnij GIL, aby inne wątki Pythona mogły działać.
m.def("slow", []() {
py::gil_scoped_release release;
// expensive C++ work, no Python access
});Wydajność
pybind11 dodaje minimalny narzut — zwykle kilka setek nanosekund na wywołanie. W przypadku nietrywialnych funkcji jest on pomijalny, ale ma znaczenie w ciasnych pętlach z funkcjami wywoływanymi o niskim koszcie.
Alternatywy
Inne rozwiązania łączące Python i C++:
- Boost.Python — starsze i cięższe
- SWIG — obsługuje wiele języków
- nanobind — nowsze i szybsze od pybind11
Praktyczne zastosowania
pybind11 sprawdza się idealnie w przypadku:
- udostępniania biblioteki C++ użytkownikom Pythona
- przyspieszania krytycznych ścieżek Pythona za pomocą kodu C++
- współdzielenia jąder numerycznych między aplikacjami C++ a narzędziami Pythona
Szybkie sprawdzenie
Jakiego makra pybind11 używa do deklarowania modułu Pythona?
Podsumowanie
pybind11 sprawia, że opakowanie kodu C++ dla Pythona jest niemal bezproblemowe. Deklaruj moduły za pomocą PYBIND11_MODULE, wiąż funkcje za pomocą m.def, a klasy za pomocą py::class_. Wbudowane konwersje obejmują typy STL, a tablice NumPy są obsługiwane bez kopiowania danych.
Często zadawane pytania
Czy lekcja „Wywoływanie Pythona z C++ za pomocą pybind11” jest bezpłatna?
Tak — pełny tekst „Wywoływanie Pythona z C++ za pomocą pybind11” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wywoływanie Pythona z C++ za pomocą pybind11”?
Opakuj kod C++ jako moduł Pythona za pomocą pybind11 Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wywoływanie Pythona z C++ za pomocą pybind11”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- extern C i ABI języka C
- Wywoływanie Pythona z C++ za pomocą pybind11
- Granice FFI między C++ i Rust
- Używanie SWIG do powiązań z wieloma językami