HardWord نشر 15 أكتوبر 2015 أرسل تقرير نشر 15 أكتوبر 2015 هل هنالك طريقة في البايثون لاستدعاء دوال سي أو سي بلس بلس؟ وما هي هذه الطريقة؟ أستخدم نظام لينكس. اقتباس
0 هشام رزق الله نشر 15 أكتوبر 2015 أرسل تقرير نشر 15 أكتوبر 2015 يعتبر استدعاء الدوال سي وسي بلس بلس من البرمجة المتقدمة بسبب تعقيدها، لكن سأحاول تفسير طريقة الاستدعاء قدر الإمكان.في البداية لنفترض أن لديك ملف 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: التوثيق الرسمي. اقتباس
السؤال
HardWord
هل هنالك طريقة في البايثون لاستدعاء دوال سي أو سي بلس بلس؟ وما هي هذه الطريقة؟ أستخدم نظام لينكس.
1 جواب على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.