0Pricing
C++ Academy · درس

استدعاء Python من C++ عبر pybind11

غلّف شيفرة C++ في صورة وحدة Python باستخدام pybind11.

استدعاء Python من C++ عبر pybind11 درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 ↔ str في Python
  • std::vector<T> ↔ list في Python
  • std::map ↔ dict في Python
  • الأنواع الرقمية ↔ int/float في Python

التشغيل البيني مع 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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «استدعاء Python من C++ عبر pybind11»؟

غلّف شيفرة C++ في صورة وحدة Python باستخدام pybind11. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «استدعاء Python من C++ عبر pybind11»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏extern C وواجهة C ABI
  2. استدعاء Python من C++ عبر pybind11
  3. حدود FFI بين C++ وRust
  4. استخدام SWIG للروابط متعددة اللغات
← العودة إلى C++ Academy