مرحباً بك بمدونتنا

Our Company Logo

كيفية تحزيم وتوزيع تطبيقات بايثون

إنّ كل مكتبات بايثون (مثل حزم التّطبيقات application packages) التي نقوم بتنزيلها باستخدام مدير الحزم package manager (مثل pip) يتمّ توزيعها باستخدام أداة مساعدة مُخصصة لهذا العمل، تقوم هذه الأدوات المساعدة بإنشاء توزيعات بايثون Python distributions والتي هي أساسا عبارة عن ملفات أرشيف مرقمة بإصدار ومضغوطة، تحتوي هذه الملفّات على جميع العناصر المتعلقة بما يتم توزيعه، مثل ملفات المصادر source files وملفات الموارد resource files.
بيثون package.thumb.png.438cd403af1da58
سنقوم في هذا الدرس بالتحدث عن الأدوات الضرورية للتوزيع، وسنتطرق إلى الخطوات الأساسية التي تسمح لنا بحزم المكتبات المفيدة الخاصة بنا، الوحدات modules، أو حتى التطبيقات applications والتي ستكون مفيدة لنا عند توزيع المشروع الخاص بنا على خادوم أو مشاركته على الإنترنت.

توزيعات وحزم بايثون

حتى ولو كنا قد عملنا قليلًا فقط مع بايثون، فنحن متآلفون مع مفهوم استخدام مدير الحزم (مثل pip ،easy_install) لتنزيل الوحدات والمكتبات (مثل هياكل تطوير التطبيقات application development frameworks) والتي يتم بعدها استيرادها واستخدامها لإنشاء واحدة جديدة.
تقوم أدوات إدارة الحِزَم هذه -والتي تعمل محليا- بالاتصال إلى مصدر بعيد source (مثل دليل حزم بايثون Python Package Index – PyPI) وتنفيذ الإجراء المطلوب (كالبحث والتنصيب).
تتكوّن طريقة توزيع تطبيق ما من تغليف الدليل directory الخاص به ببعض الملفّات الضّروريّة (مع القليل من الملفّات المُوصى بها)، تحديد العناصر المرتبطة (كالموارد resources والاعتماديات dependencies، إلخ) وإصدارها أو استخدامها في مكان آخر ببساطة.
ملاحظة: نشجعك بشدة على العمل على بيئات افتراضيّة لعزل تنزيلات بايثون، الوحدات والتطبيقات التي تعمل عليها.

1. حزم بايثون

الحزمة في بايثون هي تقنيا عبارة عن دليل قابل للاستيراد (باستخدام init__.py__ ) يحتوي على ملفات المصادر (كالوحدات)، ولا يجب الخلط بينها وبين حزم نظام التشغيل والتي هي تقنيًّا تطبيقات فعلية (مثل حزمة Debian)، ومع ذلك يجب أن نُلاحظ أنّ توزيعات بايثون في الواقع تدعى أيضًا بالحزم.
مثال على بنية الحِزمة:
حزمة 
 | 
 | - __init__ . الحمر

2. تطبيقات بايثون

على الرّغم من أنّه يُمكننا اعتبار أي شيء في بايثون كتطبيق وذلك ابتداء من ملف واحد وحتى مئات الملفات المُبعثرة عبر الحزم المُختلفة، فإنّ التطبيق في أغلب الحالات الواقعيّة يتكوّن من العديد من الوحدات والبعض من الاستيرادات الخارجيّة (من المكتبات).
مثال على بنية التّطبيق:
اسم التطبيق
 | 
| - __init__ . الحمر
 | - amodule . الحمر
 | - anothermod . الحمر
 | __ الاختبارات
 |      | 
|      | - __init__ . الحمر
 |      | -  .. 
|      | -  . 
|  ..

3. مكتبات وأدوات توزيع بايثون

نظرا لطبيعة شعبية لغة بايثون ووجود كميّة وافرة من مكتبات وتطبيقات الطرف الثالث third-party المكتوبة لأجلها فقد كان من الضّروري دوما إيجاد طريقة مُوحّدة وأبسط لتوزيعها، تُوجد العديد من المكتبات والأدوات المختلفة المُستخدمة لإنشاء توزيعات بايثون.
تمّ إنشاء مجموعة الأدوات المساعدة لتوزيع بايثون والتي تدعى distutils من أجل التعامل مع مهام التوزيع.

4. دليل حزم بايثون (Python Package Index (PyPI

دليل حزم بايثون أو PyPI هو مستودع مركزي (على الإنترنت Online) للمشاريع (توزيعات بايثون)، حيث تستخدم أدوات إدارة الحِزم مثل pip هذا المستودع من أجل استضافة، إيجاد وتثبيت الحِزَم.

البدء

فلنقم في البداية بإنشاء تطبيق بايثون بسيط وعام باستخدام إطار العمل المصغّر flask (إنشاء البنية) والذي يُمكننا لاحقًا تحزيمه.
التطبيق عبارة عن تطبيق ويب بسيط جدا، ﻷن الهدف من الدرس هو كيفية التحزيم وليس التطبيق في حد ذاته.

إنشاء بنية التطبيق

نهدف إلى إنشاء مثال يشابه معظم مشاريع العالم الحقيقي، ولهذا من الأفضل أن نتخيّل حالة تحتوي على وحدات.
بُنية المثال:
/ MyApplication 
|-- run . py
  |-- config . py
  | __ / app
       |-- __init__ . py
       |--  / module_one
           |-- __init__ . py
           |-- controllers . py
           |-- models . py                
       | __ / templates
           |-- module_one
               |-- hello . html
       | __ / static 
     | __ .. 
     | __ .

1. إنشاء المجلدات:

/ MyApplication 
|-- run . py
  |-- config . py
  | __ / app
       |-- __init__ . py
       |--  / module_one
           |-- __init__ . py
           |-- controllers . py
           |-- models . py                
       | __ / templates
           |-- module_one
               |-- hello . html
       | __ / static 
     | __ .. 
     | __ .

2. تعديل الملف run.py باستخدام برنامج nano:

نانو ~ / MyApplication / المدى . الحمر
نضع المحتويات التّالية بداخله:
# تشغيل خادم اختبار. 
من التطبيق استيراد التطبيق
التطبيق . تشغيل ( التصحيح = صحيح )
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

3. تعديل الملف config.py باستخدام برنامج nano:

نانو ~ / MyApplication / التكوين . الحمر
نضع المحتويات التّالية بداخله:
DEBUG =  صحيح 
THREADS_PER_PAGE =  4 
CSRF_ENABLED       =  صحيح 
CSRF_SESSION_KEY =  "سرية"
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

4. تعديل الملف app/init.py باستخدام برنامج nano:

نانو ~ / MyApplication / التطبيق / __init__ . الحمر
نضع المحتويات التّالية بداخله:
من قارورة استيراد  قارورة ، ل render_template

التطبيق =  قارورة ( __name__ ) 
التطبيق . التكوين . from_object ( "التكوين" )

من التطبيق . module_one . التحكم استيراد module_one
التطبيق . register_blueprint ( module_one )
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

5. تعديل الملف app/module_one/controllers.py باستخدام برنامج nano:

نانو التطبيق / module_one / التحكم . الحمر
نضع المحتويات التّالية بداخله:
من قارورة استيراد  مخطط ، طلب ، ل render_template

module_one =  مخطط ( "المصادقة" ، __name__ ، url_prefix = "/ المصادقة" )

module_one . الطريق ( "/ مرحبا" ) 
مواطنه مرحبا (): 
    عودة ل render_template ( "module_one / hello.html" )
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

6. تعديل الملف app/templates/module_one/hello.html باستخدام برنامج nano:

نانو التطبيق / قوالب / module_one / مرحبا . أتش تي أم أل
نضع المحتويات التّالية بداخله:
<DOCTYPE  HTML > 
<أتش تي أم أل  لانج = "EN" > 
<رئيس> 
    <العنوان> {٪ كتلة٪ لقب} موقعي {٪ endblock٪} </ عنوان>
    {٪ كتلة المغلق٪}
    {٪} كتل٪ نهاية
    <ميتا  اسم = "إطار العرض"  محتوى = "العرض = جهاز العرض، الأولي على نطاق و= 1.0" > 
 </ head> 
<body>
    مرحبا بالعالم!
</ body> 
</ HTML>
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

البدء بتوزيع وحزم التطبيق

بعد إنشاء بنية التطبيق المثالية لموقع ويب يستخدم flask، نستطيع المتابعة بالقيام بالخطوة الأولى في إعداد التوزيعة.

1. تبديل بنية المجلد

من أجل حَزْم تطبيقنا بشكل جيّد نحتاج للقيام ببعض الإضافات لبُنية مجلّدنا.

 
     
     
الاعداد توزيع ملف 
| - اقرأني . TXT    # لي على ملف اقرأ 
| - MANIFEST . في  # ملف البيان توزيع 
| - التغيرات . TXT السجل # التغييرات
فلنقم بتبديل بنية المجلد لإنشاء الملفات الضروريّة:
لمس ~ / MyApplication / الإعداد . الحمر
لمس ~ / MyApplication / اقرأني . الحمر
لمس ~ / MyApplication / MANIFEST . الحمر
لمس ~ / MyApplication / التغيرات . الحمر
ام     ~ / MyApplication / المدى . الحمر ~ / MyApplication / بن / المدى

2. إنشاء الملف setup.py

نانو ~ / MyApplication / الإعداد . الحمر
نضع المحتويات التّالية بداخله:
من distutils . الأساسية استيراد الإعداد

الإعداد ( 
# اسم التطبيق: 
اسم = "MyApplication" ،

# رقم الإصدار (الأولي): 
نسخة = "0.1.0" ،

# تفاصيل مؤلف التطبيق: 
المؤلف = "اسم اللقب" ، 
للمؤلف author_email = "name@addr.ess" ،

# الحزم 
الحزم = [ "التطبيق" 

# تشمل ملفات إضافية في حزمة 
include_package_data = صحيح ،

# تفاصيل 
URL = "http://pypi.python.org/pypi/MyApplication_v010/" ،

# 
# رخصة = "ترخيص. txt"، 
وصف = "المفيد الاشياء المتعلقة منشفة." ،

# long_description = المفتوحة ( "README.TXT"). قراءة ()،

# حزم التابعة (توزيعات) 
install_requires = [ 
    "القارورة" ، 

)
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.

3. إنشاء الملف MANIFEST.in

إن كنا نحتاج إلى شحن دلائل إضافية (ثابتة static أو قوالب templates) يجب علينا التصريح عنها فيmanifest لكي يتمّ حَزْمها، سنقوم بفعل هذا في MANIFEST.in.
نانو ~ / MyApplication / MANIFEST . في
نضع المحتويات التّالية بداخله:
عودي - تشمل التطبيق / القوالب * 
عودي - تشمل التطبيق / ثابت  *
نقوم الآن بحفظه والخروج منه باستخدام CTRL+X ومن ثم تأكيد ذلك باستخدام Y.
هذا هو كل ما نحتاجه ، الآن حِزمة توزيعة بايثون جاهزة ليتمّ تثبيتها وشحنها.

4. ملفات إضافية

يجب دومًا أن نتذكّر أنّه من أجل الحصول على توزيعة كاملة يجب أن يكون الملف/الدليل محتويًا على الملفّات التالية ومربوطًا بها:
  • README.TXT
  • MANIFEST.in
  • ترخيص. txt

التعامل مع التطبيق الجاهز للتوزيع

بعد أن انتهينا من إنشاء تطبيقنا ومن ثم أجرينا التبديلات الضرورية لبنية الملف لتحضيره لبناء توزيعة لا تحتوي على أيّة أخطاء، نستطيع الآن البدء بالمرور على عمليّات الحَزْم.

1. كيف نقوم بإنشاء ملف التوزيع

من أجل توليد نسخة ملف التوزيع، نقوم بتنفيذ الأمر التالي:
مؤتمر نزع السلاح      ~ / MyApplication 
الإعداد الثعبان . sdist amp؛ نسخ
سيذهب هذا الأمر إلى إعداداتنا، يطبع العمليات التي يتمّ تنفيذها ويُوَلِّد ملف أرشيف tar داخل الدليل الجديدdiet، مشابهًا لما يلي:
# @ الجذر اسم المضيف: ~ / MyApplication # ليرة سورية حي 
# MyApplication-0.1.0.tar.gz
ملاحظة: بما أنّنا لم نقم بتأهيل جميع المجلدات الفرعية (مثل static) وتعاملنا مع ملفات إضافية (مثلREADME.txt)، فقد نحصل على بعض التحذيرات أثناء عمليّة الإنشاء.

2. كيفية تثبيت التطبيق

يستطيع الآخرون من الآن فصاعدًا تثبيت واستخدام التّطبيق باستخدام ملف setup.py الذي أنشأناه.
من أجل تثبيت التطبيق نقوم بتنفيذ الأوامر التالية:
الإعداد الثعبان . PY تثبيت
إن كان هذا التثبيت من أجل التطوير وأردنا تثبيت المُتطلّبات سنقوم بتنفيذ ما يلي:
الإعداد الثعبان . PY تطوير

3. كيفية مشاركة التطبيق

إن أردنا مشاركة الشيفرة على دليل حِزَم بايثون، نستطيع فعل ذلك عن طريق بدء الإجراء register كما يلي:
الثعبان الإعداد . الحمر السجل
نستطيع إكمال هذا الإجراء عبر اتّباع التّعليمات التي تظهر على الشّاشة.
وإن كنّا نملك تسجيل دخول مسجل registered login من أجل الرفع Upload فقط نستطيع استخدام الأمر التالي:
الثعبان الإعداد . sdist تحميل الحمر

4. كيفية إنشاء حزم من الإصدارات الجديدة للتطبيق

  1. نقوم بتحرير الملف setup.py عن طريق مُحرّر نصوص (مثل nano) وتعيين رقم الإصدار الجديد "version="0.1.1.
  2. نقوم بتحرير الملف CHANGES.txt لنعكس التغييرات.
  3. نقوم بإجراء التّعديلات الضّروريّة على الملفين LICENSE.txt و README.txt.
  4. رفع الشّيفرة بعد الخطوة السّابقة.
ترجمة -وبتصرف- للمقال  كيفية توضيب وتوزيع التطبيقات بيثون لصاحبه OS Tezer.
حقوق الصورة البارزة: Designed by Freepik.



=q =w =s =d =f =g =h =t =y =u =z =x =c =v =b =n =m =a =e =r عبّر عن تعليقكالإبتسامات