0Pricing
C++ Academy · บทเรียน

การเรียกใช้ Python จาก C++ ผ่าน pybind11

ห่อหุ้มโค้ด C++ เป็นโมดูล Python ด้วย pybind11

การเรียกใช้ Python จาก C++ ผ่าน pybind11 เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้ pybind11

pybind11 เป็นไลบรารีที่มีเฉพาะไฟล์ส่วนหัว ซึ่งสร้างส่วนเชื่อมต่อ Python สำหรับโค้ด C++ โดยมีโค้ดประกอบน้อยมาก SciPy, TensorFlow และโครงการอื่นอีกมากมายใช้งานไลบรารีนี้

โมดูลขั้นต่ำ

กำหนดโมดูล Python ในไฟล์เดียวด้วยมาโคร 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");
}

การสร้างโมดูล

สร้างเป็นโมดูลส่วนขยายของ Python — โดยทั่วไปใช้ CMake หรือ setuptools

# CMake
find_package(pybind11 REQUIRED)
pybind11_add_module(mymodule mymodule.cpp)

การใช้งานจาก Python

นำเข้าและใช้งานเช่นเดียวกับโมดูล Python ใด ๆ

# Python
import mymodule
print(mymodule.add(2, 3))   # 5

การเปิดให้ใช้งานคลาส

ใช้ py::class_ เพื่อเชื่อมโยงคลาส C++ ตัวสร้าง เมธอด และคุณสมบัติทั้งหมดจะถูกแมปไปยังสิ่งเทียบเท่าใน 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);
}

การแปลงชนิดข้อมูล

pybind11 แปลงชนิดข้อมูลทั่วไปโดยอัตโนมัติ:

  • std::string ↔ Python str
  • std::vector<T> ↔ Python list
  • std::map ↔ Python dict
  • ชนิดข้อมูลตัวเลข ↔ Python int/float

การทำงานร่วมกับ NumPy

ส่งอาร์เรย์ NumPy เป็น py::array_t<T> เข้าถึงบัฟเฟอร์เพื่อดำเนินการโดยไม่ต้องคัดลอกข้อมูล

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;
}

แลมบ์ดาในฐานะส่วนเชื่อมโยง

เชื่อมโยงแลมบ์ดาโดยตรงเมื่อต้องการแปลงอาร์กิวเมนต์หรือห่อหุ้มพฤติกรรม

m.def("show", [](const Point& p) {
    return "(" + std::to_string(p.x()) + ", " + std::to_string(p.y()) + ")";
});

การปล่อย GIL

สำหรับการคำนวณ C++ ที่ใช้เวลานาน ให้ปล่อย GIL เพื่อให้เธรด Python อื่นทำงานได้

m.def("slow", []() {
    py::gil_scoped_release release;
    // expensive C++ work, no Python access
});

ประสิทธิภาพ

pybind11 เพิ่มค่าใช้จ่ายส่วนเกินเพียงเล็กน้อย — โดยทั่วไปไม่กี่ร้อยนาโนวินาทีต่อการเรียกหนึ่งครั้ง ถือว่าไม่สำคัญสำหรับฟังก์ชันที่มีการทำงานมาก แต่มีผลในลูปที่ทำงานถี่และเรียกฟังก์ชันที่มีต้นทุนต่ำ

ทางเลือกอื่น

สะพานเชื่อม Python-C++ อื่น ๆ:

  • Boost.Python — เก่ากว่าและมีขนาดใหญ่กว่า
  • SWIG — รองรับหลายภาษา
  • nanobind — ใหม่กว่าและเร็วกว่า pybind11

กรณีการใช้งานจริง

pybind11 เหมาะอย่างยิ่งสำหรับ:

  • ห่อหุ้มไลบรารี C++ สำหรับผู้ใช้ Python
  • เร่งเส้นทางการทำงานที่ใช้เวลามากของ Python ด้วยโค้ด C++
  • แบ่งปันแกนการคำนวณเชิงตัวเลขระหว่างแอปพลิเคชัน C++ และเครื่องมือ Python

ตรวจสอบความเข้าใจ

pybind11 ใช้มาโครใดเพื่อประกาศโมดูล Python

สรุปทบทวน

pybind11 ทำให้การห่อหุ้ม C++ สำหรับ Python เป็นเรื่องง่ายอย่างมาก ประกาศโมดูลด้วย PYBIND11_MODULE เชื่อมโยงฟังก์ชันด้วย m.def และเชื่อมโยงคลาสด้วย py::class_ การแปลงในตัวครอบคลุมชนิดข้อมูล STL ส่วนอาร์เรย์ NumPy รองรับการใช้งานโดยไม่ต้องคัดลอกข้อมูล

คำถามที่พบบ่อย

บทเรียน “การเรียกใช้ Python จาก C++ ผ่าน pybind11” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเรียกใช้ Python จาก C++ ผ่าน pybind11” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเรียกใช้ Python จาก C++ ผ่าน pybind11”

ห่อหุ้มโค้ด C++ เป็นโมดูล Python ด้วย pybind11 คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเรียกใช้ Python จาก C++ ผ่าน pybind11” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Extern C และ C ABI
  2. การเรียกใช้ Python จาก C++ ผ่าน pybind11
  3. C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI
  4. การใช้ SWIG สำหรับการเชื่อมโยงหลายภาษา
← กลับไปที่ C++ Academy