اذهب إلى المحتوى

السؤال

Recommended Posts

  • 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: التوثيق الرسمي.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...