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

إستدعاء كود C/C++ من خلال بايثون

Fahmy Mostafa

السؤال

قرأت منذ فترة أنه يمكن تشغيل كود مكتوب بلغة C/C++ من داخل ملف بايثون وذلك لأن لغة بايثون تم تصميمها بإستخدام لغة C. هل يمكن القيام بهذا الأمر؟ وكيف يتم تطبيقه عمليًا؟ وهل هناك ملاحظات أو أخطاء قد تحدث بسبب هذه الطريقة في التطبيق (استخدام أكثر من لغة في برنامج واحد)؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

من أجل الإستفادة من قوة اللغتين ، المطورين يستخدمون مايسمى بروابط بايثون python bindings والذي يتيح لك إستدعاء مكتبات ++C/C من بايثون

ولكن لماذا هناك الحاجة للقيام بذلك؟

  1. كما نعلم لغة C لديها سرعة تنفيذ أسرع ، وللتغلب على قفل المسفر العالمي Global Interpreter Lock في بايثون ، فإن روابط بايثون مفيدة
  2. يوجد لدينا مكتبات كبيرة ومستقرة وتم إختبارها في ++C/C ، ويمكننا الإستفادة منها
  3. لإجراء اختبار واسع للأنظمة بإستخدام أدوات اختبار python

لنرى كود C الذي نريد إستدعائه في بايثون

#include <iostream>
class Geek{
    public:
        void myFunction(){
            std::cout << "Hello World!!!" << std::endl;
        }
};
int main()
{
    // إنشاء كائن
    Geek t; 
  
    // إستدعاء الدالة
    t.myFunction();  
   
    return 0;
}

وايضا يجب منح تصريحات cpp declarations ك "extern "C لان ctypes يستطيع التفاعل مع دوال C فقط

extern "C" {
    Geek* Geek_new(){ return new Geek(); }
    void Geek_myFunction(Geek* geek){ geek -> myFunction(); }
}

الآن لنقم بترجمة compile الكود الى المكتبة المشتركة shared library

g++ -c -fPIC geek.cpp -o geek.o
g++ -shared -Wl, -soname,libkgeek.so -o libgeek.so geek.o

وآخيراً كتابة كود بايثون 

# إستدعاء الوحدة
from ctypes import cdll
  
# تحميل المكتبة
lib = cdll.LoadLibrary('./libgeek.so')
  
# إنشاء كائن
class Geek(object):
  
    # دالة البناء
    def __init__(self):
  
        # الصفة
        self.obj = lib.Geek_new()
  
    # تعريف الدالة
    def myFunction(self):
        lib.Geek_myFunction(self.obj)
  
# إنشاء كائن
f = Geek()
  
# إستدعاء الدالة
f.myFunction()

والنتيجة كالآتي

Hello World!!!

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لنفترض انه لديك دالة c++

char const* greet()
{
   return "hello, world";
}

يمكن أن تتعرض لبايثون بكتابة غلاف Boost.Python:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}
>>> import hello_ext
>>> print hello_ext.greet()
hello, world

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...