لماذا يصعب بناء تطبيقات Python المستقلة

تقضي أسابيع في بناء أداة Python مفيدة. تعمل الأداة بشكل مثالي على جهازك، ولكن عندما تحاول مشاركتها مع زميل لك، تفشل العملية لأن Python ليس مثبتاً لديه.

هذه معاناة شائعة. فتغليف Python في ملف واحد يعمل في كل مكان هو أمر صعب، ولا يقتصر الأمر مجرد نقص في ملف المتطلبات (requirements file).

تبدأ المشكلة من طريقة عمل Python.

لغة Python هي لغة ديناميكية، فهي تتخذ العديد من القرارات أثناء تشغيل البرنامج. يمكنها استيراد المكتبات أثناء التشغيل، ويمكنها تغيير كيفية عمل الدوال أثناء تنفيذها.

أما اللغات المجمعة (Compiled languages) مثل Go أو Rust، فهي تقرر كل شيء قبل بدء البرنامج، وتقوم بإزالة الأكواد غير المستخدمة لإنشاء ملفات صغيرة وسريعة.

لا يمكن لـ Python القيام بذلك؛ فلا يمكنك التنبؤ بسهولة بالأجزاء التي سيحتاجها الكود الخاص بك من بيئة التشغيل (runtime). ولضمان عمله، يجب عليك تضمين بيئة تشغيل Python بالكامل.

وهذا يؤدي إلى مشكلة المكتبات.

في اللغات الأخرى، تستخدم المترجمات تقنية tree-shaking للحفاظ على صغر حجم الملفات، لكن Python لا يمكنه استخدام هذه التقنية. يجب عليك تضمين كل تبعية (dependency) وكل تبعية فرعية، كما يجب عليك تضمين الملفات الثنائية المجمعة (compiled binary files). وهذا ما يحول نصك البرمجي الصغير إلى حزمة بحجم 300 ميجابايت.

لديك ثلاثة خيارات رئيسية:

  • اشتراط وجود Python على الجهاز المستهدف. هذا الخيار يناسب المطورين ولكنه لا يصلح للمستخدمين العاديين.
  • دمج المفسر (interpreter). تقوم أدوات مثل PyInstaller أو Nuitka بتعبئة بيئة التشغيل داخل تطبيقك. يعد PyInstaller شائع الاستخدام، بينما يقوم Nuitka بتحويل الكود الخاص بك إلى لغة C لتحسين السرعة.
  • استخدام Docker. يوفر هذا الخيار موثوقية تامة من خلال تضمين طبقة نظام التشغيل بالكامل. وهو يعمل بشكل جيد مع الخوادم ولكنه ينتج ملفات كبيرة الحجم.

توفر الأدوات الجديدة مثل PyApp حلاً وسطاً، حيث تستخدم مشغلاً (launcher) صغيراً لتنزيل إصدار Python المناسب لك.

كيف تختار:

• للفرق التقنية: استخدم بيئة افتراضية (virtual environment) وملف متطلبات (requirements file). • لغير المطورين: استخدم PyInstaller، فهي الطريقة الأكثر اختباراً. • للخوادم ومسارات البيانات (data pipelines): استخدم Docker؛ فالموثوقية هنا أهم من حجم الملف. • لتطبيقات سطح المكتب حيث تهم السرعة: استخدم Nuitka.

لن تغير Python طبيعتها الأساسية لإصلاح هذه المشكلة، فستظل اللغة ديناميكية. لذا، يجب أن نعتمد على أدوات أفضل لسد هذه الفجوة.

المصدر: https://dev.to/azadarjoe/why-standalone-python-apps-are-so-hard-to-build-3g31