Memanggil Python daripada C++ melalui pybind11
Balut kod C++ sebagai modul Python menggunakan pybind11.
Memanggil Python daripada C++ melalui pybind11 ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Mengapa pybind11?
pybind11 ialah pustaka berasaskan fail pengepala sahaja yang mencipta pengikatan Python untuk kod C++ dengan kod rangka yang minimum. Ia digunakan oleh SciPy, TensorFlow dan banyak projek lain.
Modul Minimum
Takrifkan modul Python dalam satu fail menggunakan makro 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");
}Membina Modul
Bina sebagai modul sambungan Python — biasanya dengan CMake atau setuptools.
# CMake
find_package(pybind11 REQUIRED)
pybind11_add_module(mymodule mymodule.cpp)Menggunakan dari Python
Import dan gunakan seperti mana-mana modul Python.
# Python
import mymodule
print(mymodule.add(2, 3)) # 5Mendedahkan Kelas
Gunakan py::class_ untuk mengikat kelas C++. Pembina, kaedah dan sifat semuanya dipetakan kepada padanan 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);
}Penukaran Jenis
pybind11 menukar jenis umum secara automatik:
std::string↔ Python strstd::vector<T>↔ Python liststd::map↔ Python dict- Jenis angka ↔ Python int/float
Saling Kendali NumPy
Hantar tatasusunan NumPy sebagai py::array_t<T>. Capaikan penimbal untuk operasi tanpa salinan.
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;
}Lambda sebagai Pengikatan
Ikat lambda secara langsung apabila anda mahu mengubah argumen atau membungkus tingkah laku.
m.def("show", [](const Point& p) {
return "(" + std::to_string(p.x()) + ", " + std::to_string(p.y()) + ")";
});Melepaskan GIL
Untuk pengiraan C++ yang panjang, lepaskan GIL supaya utas Python lain boleh berjalan.
m.def("slow", []() {
py::gil_scoped_release release;
// expensive C++ work, no Python access
});Prestasi
pybind11 menambah overhed yang minimum — biasanya beberapa ratus nanosaat bagi setiap panggilan. Tidak ketara untuk fungsi yang tidak remeh, tetapi penting dalam gelung ketat dengan fungsi yang dipanggilnya murah.
Alternatif
Jambatan Python-C++ lain:
- Boost.Python — lebih lama dan lebih berat
- SWIG — menyokong banyak bahasa
- nanobind — lebih baharu dan lebih pantas daripada pybind11
Kes Penggunaan Dunia Sebenar
pybind11 sesuai untuk:
- Membalut pustaka C++ untuk pengguna Python
- Mempercepat laluan panas Python dengan kod C++
- Berkongsi teras berangka antara aplikasi C++ dan alat Python
Semakan Pantas
Makro apakah yang digunakan oleh pybind11 untuk mengisytiharkan modul Python?
Rumusan
pybind11 menjadikan pembungkusan C++ untuk Python hampir tanpa usaha. Isytiharkan modul dengan PYBIND11_MODULE, ikat fungsi dengan m.def dan kelas dengan py::class_. Penukaran terbina dalam meliputi jenis STL; tatasusunan NumPy tidak memerlukan penyalinan data.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Memanggil Python daripada C++ melalui pybind11” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Memanggil Python daripada C++ melalui pybind11”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Memanggil Python daripada C++ melalui pybind11”?
Balut kod C++ sebagai modul Python menggunakan pybind11. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Memanggil Python daripada C++ melalui pybind11” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Extern C dan ABI C
- Memanggil Python daripada C++ melalui pybind11
- C++ untuk Sempadan FFI Rust
- Menggunakan SWIG untuk Binding Berbilang Bahasa