يتم التقاط قوة Pybind11 من خلال الاقتباس التالي من README PYBIND11:
Pybind11 هي مكتبة رأس خفيفة الوزن فقط تعرض أنواع C ++ في Python والعكس بالعكس ، وذلك أساسًا لإنشاء روابط Python لرمز C ++ الحالي. تشبه أهدافها وبناء جملة مكتبة Boost.python الممتازة من قبل David Abrahams ...
المشكلة الرئيسية في Boost.python - والسبب لإنشاء مثل هذا المشروع المماثل - هو التعزيز. Boost هو مجموعة كبيرة ومعقدة من مكتبات المرافق التي تعمل مع كل مترجم C ++ تقريبًا. ... الآن بعد أن أصبحت المترجمين المتوافقة مع C ++ 11 متوفرة على نطاق واسع ، أصبحت هذه الآلية الثقيلة تبعية كبيرة وغير ضرورية بشكل مفرط.
يحتوي هذا المستودع على عدة أمثلة لاستخدام Pybind11. على الرغم من أن الوثائق عبر الإنترنت التي يوفرها مطورو Pybind11 تجعل استخدامه واضحًا نسبيًا ، إلا أن العديد من الأمثلة - مثل المنصوص عليها هنا - تجعل Pybind11 أسهل في الاستخدام. تهدف هذه الأمثلة إلى أن تبدأ بشكل أسرع مع Pybind11. ومع ذلك ، فهي ليست شاملة بأي حال من الأحوال ، ولا توفر دائمًا الخيار الأمثل. لذلك من المستحسن أن تفكر بنفسك . علاوة على ذلك ، فإن المساهمات ذات الأمثلة البسيطة المماثلة (أو عن طريق زيادة تحسين الأمثلة الحالية) هي موضع ترحيب كبير . يرجى تقديم طلب سحب أو مشكلة على github ، أو الاتصال بي.
لإعطاء الائتمان عند استحقاق الائتمان:
قام منشئو Pybind11 بعمل رائع! إنه سهل الاستخدام حقًا وخفيف الوزن للغاية. أيضا الوثائق كاملة بالفعل.
كانت الأمثلة التي تم توفيرها من قبل Cliburn Chan و Janice McCarthy ، في جامعة Duke هي مساعدة هائلة. يرجى أيضا قراءة وثائقهم.
لاحظ أن هناك أيضًا حالات اختبار تتضاعف كأمثلة في مستودع Pybind11 ، ولكن هذه ليست ثاقبة للغاية عندما تكون جديدًا على Pybind11.
أخيرًا ، يستخدم Pybind11 بنشاط. لذلك يمكن للمرء أن يبحث في المكتبات التي تم صيانتها بنشاط لحلول محددة. على سبيل المثال:
يتم تضمين وحدة Pybind11 (وهي رأس فقط!) كوحدة فرعية لهذا المستودع. هذا يتطلب بعض الاهتمام عند استنساخ هذا المشروع. هناك خياران:
أبسط خيار هو:
git clone --recursive https://github.com/tdegeus/pybind11_examples.gitسيؤدي ذلك إلى تنزيل الجهاز الفرعي حتى الإصدار المستخدم في هذا المشروع. للتحديث إلى أحدث التزام بالوحدة الفرعية نفسها:
git submodule update --remoteيمكن للمرء أيضًا تنزيل الجهاز الفرعي مباشرة من المصدر:
git clone https://github.com/tdegeus/pybind11_examples.git
cd pybind11_examples
git submodule init
git submodule updateيتم استخدام مكتبة Eigen في بعض الأمثلة numpy. من هذه الأمثلة ، يمكن ملاحظة أنه من خلال Pybind11 ، فإن Eigen و Numpy هي وحدات مصافحة حقًا. لا يوجد أي رمز تقريبًا لإنشاء واجهة C ++/Python. لاحظ أن معظم البساطة تعتمد على النسخ التي يتم تمريرها ، هناك حاجة إلى بعض الاهتمام إذا أراد المرء أن يمر بالرجوع إليه.
لا يحتاج Eigen إلى التثبيت لأنه رأس أيضًا. يحتاج المرء فقط إلى تنزيل الملفات وتضمين الرؤوس في وقت الترجمة.
بشكل عام ، يمكن للمرء تنزيل وتثبيت eigen بواسطة:
mkdir /path/to/temp/build
cmake /path/to/eigen/download
make installلماكوس يمكن للمرء استخدامه ببساطة
brew install eigen
بعد ذلك تجميع مع
clang++ -I/path/to/eigen/instalation ...لاحظ أنه عند تكوينه بشكل صحيح (وهو أمر عادة ما يكون) ، يمكن استخدام PKG-Config لتتبع المسارات:
clang++ ` pkg-config --cflags eigen3 ` ...أو يمكن للمرء استخدام cmake (انظر أدناه).
إذا كان لديك مكتبة بسيطة ، فقد ترغب في القيام بكل شيء بنفسك. في هذه الحالة ، تقوم بتجميع مصدر C ++ الخاص بك إلى كائن مشترك مرتبط بـ Python. هذا يتلخص في
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC يمكن تجميع تطبيقات Pybind11 سهلة للغاية باستخدام Cmake. من أجل البساطة ، يتم تضمين pybind11 كجهاز فرعي للأمثلة أدناه (في الواقع باستخدام رابط رمزي على العديد من النسخ) ، حتى نتمكن من استخدام CMakeLists.txt مثل:
cmake_minimum_required ( VERSION 2.8.12)
project (example)
add_subdirectory (pybind11)
pybind11_add_module(example example.cpp) (حيث تتكون وحدة المثال هذه من ملف مصدر واحد example.cpp ). لتجميعها ، استخدم:
cd /path/to/build
cmake /path/to/example/src
make عندما يتم تثبيت eigen ، يمكن تضمينه بسهولة عن طريق إضافة ما يلي في CMakeLists.txt :
find_package ( PkgConfig )
pkg_check_modules( EIGEN3 REQUIRED eigen3 )
include_directories ( ${EIGEN3_INCLUDE_DIRS} ) يمكن استخدام معيار C ++ 14 من خلال تضمين ما يلي في CMakeLists.txt :
set (CMAKE_CXX_STANDARD 14) يمكن إضافة ملف ملف setup.py إلى مكتبتك. يمكنك بعد ذلك تجميع وتثبيت باستخدام
python3 setup.py build
python3 setup.py install على الرغم من أن كتابة setup.py ليس صعبًا ، إلا أنه لم يتم تغطيته هنا. يمكن للمرء استخدام بعض الأدوات المضمنة في CPPMAT ، والتي يمكن تثبيتها باستخدام PIP (مثل pip3 install cppmat ). علاوة على ذلك ، يمكن أن ننظر إلى setup.py على سبيل المثال goosetensor أو عدة مستودعات أخرى.
يتميز هذا المثال بوظيفة واحدة modify تأخذ قائمة (للقراءة فقط) ، ويضاعف جميع الإدخالات بمقدار اثنين ، ويعيدها كقائمة من الزوجي (انظر example.cpp ). من Python هذه الوظيفة موجودة في example وحدة بسيطة (انظر test.py ).
الغرض من هذا المثال هو إظهار كيفية جعل وظيفة تقبل قائمة ، وكيفية تحويل هذا إلى ناقل C ++ std::vector ، وكيفية إعادة std::vector جديدة (أو قائمة). لاحظ أن العملية الفعلية ليست مهمة للغاية ، فهي الواجهة الموضحة.
لتجميع ، إما استخدام cmake ، حيث تتم قراءة تعليمات التجميع من CMakeLists.txt بعد ذلك:
cmake .
makeأو ، قم بالتجميع مباشرة باستخدام:
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPICقم بتشغيل المثال:
python3 test.pyلتشغيل مع Python 2 ، ما عليك سوى استبدال حدوث اثنين من "Python3" أعلاه مع "Python". لتعديل تعليمات CMAKE ابحث عن المزيد عبر الإنترنت.
مثل المثال السابق ، ولكن مع قائمة متداخلة.
modify الوظيفة التي تحول الإدخالات من صفيف أحادي البعد إلى الأعداد الصحيحة ، ثم تضاعف هذه الإدخالات بمقدار 10.
الغرض من هذا المثال هو إظهار كيفية جعل وظيفة تقبل صفيف numpy أحادي البعد ، وكيفية تحويل هذا إلى ناقل C ++ std::vector ، وكيفية إرجاع مجموعة numpy أحادية البعد. لاحظ أن الواجهة التي تم إنشاؤها باستخدام PyBind11 مرنة لدرجة أنها تقبل حتى مدخلات قائمة على جانب Python.
length وظيفة واحدة. تقبل هذه الوظيفة "مصفوفة" تضم قائمة من متجهات الموضع ثنائية الأبعاد ، كصفوف. والنتيجة هي مرة أخرى "مصفوفة" مع كل صف لموضع "X" و "Y" ، وطول متجه الموضع ثنائي الأبعاد.
وظيفتان det و inv يستخدمان مكتبة eigen.
الغرض من هذا المثال هو إظهار مدى تافهة التفاعل بين C ++/Eigen و Python/Numpy.
لتجميع باستخدام Cmake والتشغيل ، اتبع الإرشادات أعلاه (حيث يتم تضمين رؤوس Eigen في CMakeLists.txt . لتجميع مباشرة ، بالإضافة إلى ذلك يجب تضمين رؤوس eigen:
c++ -O3 -shared -std=gnu++11 -I /path/to/eigen -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPICعلى سبيل المثال على MacOS مع Homebrew:
c++ -O3 -shared -std=gnu++11 -I /usr/local/Cellar/eigen/3.3.1/include/eigen3 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC فئة مخصصة CustomVectorXd مع وظيفة واحدة mul . يستخدم هذا الفصل مكتبة Eigen. ويشمل أيضا وسيطة افتراضية.
علاوة على ذلك ، يحتوي هذا المثال على وظيفة trans (لا علاقة تمامًا لفئة CustomVectorXd المخصصة). الغرض من ذلك هو إظهار كيفية إعادة Eigen::VectorXi جديدة (أو Numpy-Array).
وظيفة واحدة مثقلة mul . تعمل هذه الوظيفة "بشكل مختلف" إذا تم استدعاؤها باستخدام الوسائط int أو الوسيطات double . لاحظ أن السلوك الافتراضي لـ Pybind11 قوي للغاية. عند استدعاء الوظيفة مع وسيطة int واحدة ووسطة double واحدة ، ستختار الوحدة النسخة double من mul (وسوف يلقي الوسيطة int double ).
لتجميع ، تأكد من استخدام معيار C ++ 14 ، على سبيل المثال من خلال تضمين -std=c++14 كوسيطة مترجم.
على غرار المثال السابق ، ولكن مع حجج eigen (أي الحجج numpy من جانب بيثون).
لتجميع ، تأكد من استخدام معيار C ++ 14.
يتضمن هذا المثال فئة مصفوفة مخصصة في C ++ (في matrix.h ). يقترن هذه الفئة بمشاهدة numpy باستخدام واجهة بسيطة (في pybind_matrix.h ). وبالتالي فإن الوظائف (في example.cpp ) لا تتطلب أي رمز غلاف خاص.
انظر أيضا هذه المناقشة حول سعة مكدس.
يتميز هذا المثال طريقة للتفاعل مع التعداد في C ++. من حيث المبدأ ، الواجهة واضحة ومباشرة ولكنها تستدعي "خدعة". هنا يتم استخدام وحدة فرعية لتكون قادرة على التفاعل مع العداد بنفس الطريقة كما في C ++.
يحتوي هذا المثال على مثال كلاسيكي حيث يتم اشتقاق فئة أو أكثر من أحد الوالدين أو قالب معين. يحتوي هذا المثال بالذات على حيوانين ، Dog Cat ، كلاهما مشتق من فئة Animal عامة. هناك talk وظيفة يقبل Animal العام وبالتالي أي من الطبقات المشتقة.
تتطلب هذه الحالة بالذات واجهة أكثر مشاركة ، كما هو موضح في الوثائق.
يتميز هذا المثال بفئة CRTP بسيطة مع "قاعدة" و "فئة مشتقة" ، وتسجيلها إلى Pybind11 API.
في بعض الأحيان ، لا يستطيع py::overload_cast حل وظيفتك ، على سبيل المثال عندما لا يمكن استنتاج نوع الإرجاع. في هذه الحالة ، يمكنك أن تكون صريحًا من خلال static_cast ing مؤشر إلى وظيفتك ، يمكن العثور على مزيد من المعلومات في الوثائق.