• 0

كيف استدعي دوال سي/سي بلس بلس من البايثون؟

هل هنالك طريقة في البايثون لاستدعاء دوال سي أو سي بلس بلس؟ وما هي هذه الطريقة؟ أستخدم نظام لينكس.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

يعتبر استدعاء الدوال سي وسي بلس بلس من البرمجة المتقدمة بسبب تعقيدها، لكن سأحاول تفسير طريقة الاستدعاء قدر الإمكان.
في البداية لنفترض أن لديك ملف foo.cpp به شيفرة برمجية بسيطة كالتالي:

#include <iostream>

class Foo{
    public:
        void bab(){
            std::cout << "Hello" << std::endl;
        }
};

وبما أن ctypes في البايثون يستطيع فقط التحدث مع دوال السي، فسنقوم بتعريفهم كـ extern "C" كما في المثال التالي:

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bab(Foo* foo){ foo->bab(); }
}

بعد ذلك سنقوم بتجميع (compile) هذه الشيفرة البرمجية إلى مكتبة مشتركة كالتالي:

g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so  foo.o

بعد ذلك سنقوم باستدعاء هذه المكتبة عن طريق البايثون:

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self):
        lib.Foo_bab(self.obj)

ويمكنك بعد ذلك استدعاء الدوال الموجودة في المكتبة(المكتوبة بالسي بلس بلس) بسهولة كالتالي:

f = Foo()
f.bab() #and you will see "Hello" on the screen

للمزيد من المعلومات حول مكتبة ctypes: التوثيق الرسمي.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن