سؤال

تحتوي بعض مكتبات C القياسية التي أرغبت في الوصول إليها باستخدام Cython لها طن من الأعلام. تذكر Docs Cythron أنه يجب أن نستج أجزاء الرأس التي أحتاجها. وهو ما يرام عندما يتعلق الأمر بتعريفات الوظائف. عادة ما يتم تكرارها في كل مكان، وشملت المستندات. ولكن ماذا عن كل تلك الأرقام السحرية؟

إذا كنت أريد الاتصال mmap, ، يمكنني دائما العثور على تعريف الوظيفة ولصقه في ملف .pxd:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

لكن استدعاء ذلك يحتاج إلى طن من الأعلام مثل PROT_READ, MAP_ANONYMOUS وما إلى ذلك وهلم جرا. لدي مشكلتان على الأقل مع هذا:

أولا، إنه أمر مزعج للمطاردة بالضبط حيث يتم تعريف هذه الأرقام. في الواقع، أفضل كتابة ملف .c وطباعة القيم التي أحتاجها. هل هناك أي طريقة أفضل لإيجاد قيمة علامة معينة مثل PROT_READ?

ثانيا، ما مدى استقرار هذه الأرقام؟ بعد استخراج جميع القيم التي أحتاجها وأصلتها في مصدر سيليون، ما هي الفرص التي تتجمع على منصة مختلفة قد تحولت حولها، دعنا نقول PROT_READ و PROT_EXEC?

حتى لو كانت الإجابة هي أنه لا توجد طرق جيدة أو مناسبة للقيام بذلك، أود أن أسمعها. يمكنني دائما أن أقبل أن هناك شيئا مرهقا طالما أعرف أنني لا أفتقد شيئا ما.

هل كانت مفيدة؟

المحلول

لاستخدام هذه الثوابت من سيلون، لا تحتاج إلى معرفة المكان الذي جاءوا به أو ما هو أكثر مما تفعله من C. على سبيل المثال، يمكن أن يبدو ملف .pxd الخاص بك

cdef extern from "foo.h":
    void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
    cdef int PROT_READ
    cdef int MAP_ANONYMOUS
    ...

طالما أن التعريفات (بشكل مباشر أو غير مباشر) المدرجة من foo.h، هذا يجب أن يعمل بشكل جيد.

نصائح أخرى

هناك العديد من البدائل الممكنة:

  1. استخدام الأعلام من بيثون mmap وحدة.
    • بسيط
    • يعمل فقط عندما تكون هناك ارتباطات بيثون الحالية
  2. استخدم بيثون mmap كائن في المقام الأول، وتسليمها إلى رمز سيلون الخاص بك
    • حتى أبسط فتح
    • قد يكون بعض python النفقات العامة
  3. استخدم رمز مولد ctypeslib
  4. مجرد نسخ الأرقام.

القول، الأرقام تكون مستقرة جدا. إذا كان قد يتغيرون، فسيكون من كل برنامج C باستخدام MMAP، حيث يتعين إعادة ترجمة MMAP، حيث يتم احتواء الأعلام من الرؤوس في الثنائي.

تعديل: mmap يكون جزء من posix., ، لكن القراءة السريعة لم تكشف ما إذا كان يجب أن تكون الأعلام نفس القيمة على جميع المنصات.

اكتب ملف foo.c مع هذا بمثابة المحتويات:

#include <sys/mman.h>

ثم اركض

cpp -dM foo.c | grep -v __ | awk '{if ($3) print $2, "=", $3}' > mman.py

الذي سيخلق ملف Python يحدد جميع الثوابت من Mman.h

من الواضح أنه يمكنك القيام بذلك ليشمل المتعدد إذا كنت تريد.

قد يحتاج الملف الناتج قليلا من التنظيف، لكنه سيحصل عليك إغلاقه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top