0Pricing
C++ Academy · Lekcja

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))   # 5

Udostę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 str
  • std::vector<T> ↔ Python list
  • std::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

  1. extern C i ABI języka C
  2. Wywoływanie Pythona z C++ za pomocą pybind11
  3. Granice FFI między C++ i Rust
  4. Używanie SWIG do powiązań z wieloma językami
← Powrót do C++ Academy