نحن نصنع أصدقاء Python و Bash: مكتبات env الذكية و python-shell

يوم جيد للجميع.

تعد Python اليوم واحدة من أكثر اللغات استخدامًا في مجال إنشاء منتجات برمجيات مباشرة ليس فقط ، ولكن أيضًا توفير بنيتها التحتية. ونتيجة لذلك ، كان على العديد من المطورين ، بإرادتهم أو ضدها ، تعلم لغة جديدة لاستخدامها لاحقًا كمكمل لنصوص Bash القديمة الجيدة. ومع ذلك ، فإن Bash و Python يصرحان بطرق مختلفة لكتابة التعليمات البرمجية ولديهما ميزات معينة ، في ضوء أن نقل نصوص Bash إلى "لغة الثعبان" يعد في بعض الأحيان مهمة كبيرة وبعيدة عن المهمة التافهة.

لتسهيل الحياة على أدوات التطوير ، تم إنشاء العديد من المكتبات والمرافق المفيدة في Python ويستمر إنشاؤها. تصف هذه المقالة على الفور مكتبتين جديدتين أنشأهما مؤلف هذا المنشور - smart-envو python-shell - ومصممة لإنقاذ devops من الحاجة إلى إيلاء اهتمام كبير لتعقيدات العمل مع Python ، وترك مساحة لمهام أكثر إثارة للاهتمام. نطاق المكتبة هو متغيرات البيئة وإطلاق المرافق الخارجية.

الذين يهتمون ، من فضلك ، تحت القط.

دراجات جديدة؟


يبدو ، لماذا إنشاء حزم جديدة لعمليات دنيوية إلى حد ما؟ ما الذي يمنع الاستخدام المباشر لـ os.environ والعملية الفرعية. <الطريقة أو الفئة التي تختارها>؟

سأقدم أدلة لصالح كل من المكتبات بشكل منفصل.

مكتبة Smart-env


قبل كتابة طفلك ، من المفيد تصفح الإنترنت والبحث عن حلول جاهزة. بالطبع ، هناك خطر من عدم العثور على ما تحتاجه ، بل هو "حالة تأمين". كقاعدة ، يعمل النهج ويوفر الكثير من الوقت والجهد.

ووفقا ل نتائج البحث ، تم الكشف عن ما يلي:

  • هناك حزم تعمل في الواقع على لف المكالمات إلى os.environ ، ولكنها تتطلب في الوقت نفسه مجموعة من الإجراءات التي تشتت الانتباه (إنشاء مثيل من الفصل ، ومعلمات خاصة في المكالمات ، وما إلى ذلك) ؛
  • هناك حزم جيدة ، ومع ذلك ، مرتبطة ارتباطًا وثيقًا بنظام بيئي معين (بشكل أساسي أطر الويب مثل Django) وبالتالي فهي ليست عالمية بدون ملف ؛
  • هناك محاولات نادرة للقيام بشيء جديد. على سبيل المثال ، أضف كتابة وقم بتحليل قيم المتغيرات بشكل صريح من خلال استدعاء طرق النموذج

    get_<typename>(var_name)

    أو هنا حل آخر ، ومع ذلك ، لا يدعم حاليًا Python 2 الخائن (الذي ، على الرغم من RIP الرسمي ، لا تزال هناك جبال من الشفرة المكتوبة والنظم البيئية بأكملها) ؛
  • هناك حرف يدوية للطالب في المدرسة ، ليس من الواضح على الإطلاق لماذا انتهى بهم الأمر في PyPI المنبثقة ويخلقون فقط مشاكل في تسمية الحزم الجديدة (على وجه الخصوص ، يعد اسم "smart-env" إجراءً ضروريًا).

والقائمة تطول وتطول. ومع ذلك ، كانت النقاط المذكورة أعلاه كافية لاستيعاب فكرة صنع شيء مناسب وعالمي.

متطلبات سمارت إنف:

  • أبسط مخطط للاستخدام
  • دعم طباعة بيانات قابلة للتكوين بسهولة
  • Python 2.7 متوافق
  • تغطية اختبار جيدة

في النهاية ، تم تحقيق كل هذا. هنا مثال للاستخدام:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

كما ترى من المثال ، يكفي العمل مع الفصل الجديد لاستيراده (لا تحتاج إلى إنشاء مثيل - ناقص الإجراء الإضافي). يتم الوصول إلى أي متغير بيئة من خلال الإشارة إليه كمتغير فئة ENV ، مما يجعل هذه الفئة في الواقع غلافًا بديهيًا لبيئة النظام الأصلي ، مما يحولها في الوقت نفسه إلى متغير محتمل لعنصر التكوين لأي نظام تقريبًا (يتم تحقيق نهج مماثل ، على سبيل المثال ، في Django ، هناك فقط كائن التكوين هو حزمة الوحدة النمطية / الإعدادات مباشرة).

يتم تحقيق تمكين / تعطيل وضع دعم الكتابة التلقائية باستخدام طريقتين - enable_automatic_type_cast () و disable_automatic_type_cast (). يمكن أن يكون ذلك مناسبًا إذا كان متغير البيئة يحتوي على كائن متسلسل يشبه JSON أو حتى ثابت منطقي (يعد تعيين متغير DEBUG في Django صراحةً بمقارنة متغير البيئة بسلسلة "صالحة" من أكثر الحالات شيوعًا). ولكن الآن ليست هناك حاجة لتحويل الخطوط بشكل صريح - معظم الإجراءات الضرورية مضمنة بالفعل في أحشاء المكتبة ولا تنتظر سوى إشارة إلى العمل. :) بشكل عام ، تعمل الكتابة بشفافية وتدعم تقريبًا جميع أنواع البيانات المضمنة المتاحة (لم يتم اختبار frozenset والمعقدة والبايت).

تم تنفيذ متطلبات الدعم لـ Python 2 بدون أي تضحيات تقريبًا (التخلي عن الكتابة وبعض حلوى السكر في الإصدارات الأخيرة من Python 3) ، على وجه الخصوص ، بفضل الستة في كل مكان (لحل مشاكل استخدام metaclasses).

ولكن هناك بعض القيود:

  • يشير دعم Python 3 إلى الإصدار 3.5 والإصدارات الأعلى (وجودها في مشروعك ناتج إما عن الكسل أو عدم الحاجة إلى التحسينات ، لأنه من الصعب التوصل إلى سبب موضوعي لكونك لا تزال جالسًا على 3.4) ؛
  • في Python 2.7 ، لا تدعم المكتبة إلغاء التسلسل من مجموعة حرفية. الوصف هنا . ولكن ، إذا كان شخص ما يريد تنفيذ - نرحب :) ؛

كما تقر المكتبة بآلية استثناء في حالة أخطاء التحليل. إذا لم يتعرف أي من المحللين المتاحين على السلسلة ، تبقى القيمة سلسلة (بدلاً من ذلك ، لأسباب الراحة والتوافق العكسي مع المنطق المعتاد للمتغيرات في Bash).

مكتبة Python-shell


الآن سأتحدث عن المكتبة الثانية (أنا حذفت وصف أوجه القصور في نظائرها المتاحة - هو مماثلة لتلك التي وصفها لالذكية الحياة الفطرية النظير - هنا و هنا ).

بشكل عام ، فكرة التنفيذ ومتطلباته مماثلة لتلك الموصوفة لـ smart-env ، كما يتبين من المثال:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

الفكرة هي:

  1. فئة واحدة تمثل باش في عالم بايثون.
  2. يتم استدعاء كل أمر Bash كدالة لفئة Shell ؛
  3. يتم بعد ذلك إعادة توجيه معلمات الاستدعاء لكل دالة إلى الاستدعاء إلى الأمر Bash المقابل ؛
  4. يتم تنفيذ كل أمر "هنا والآن" في وقت المكالمة ، أي يعمل نهج متزامن.
  5. من الممكن الوصول إلى أمر العادم في stdout ، وكذلك رمز الإرجاع الخاص به ؛
  6. إذا كان الأمر غائبًا في النظام ، يتم طرح استثناء.

كما هو الحال مع smart-env ، يتم توفير دعم Python 2 (على الرغم من أنه استغرق المزيد من الدم القرباني) ولا يوجد دعم لـ Python 3.0-3.4.

خطط تطوير المكتبة


يمكنك استخدام المكتبات الآن: كلاهما موجود في PyPI الرسمي. المصادر متاحة على Github (انظر أدناه).

سيتم تطوير كلتا المكتبتين مع مراعاة الملاحظات التي تم جمعها من المهتمين. وإذا كان من الصعب في smart-env الخروج بمجموعة متنوعة من الميزات الجديدة ، فهناك بالتأكيد شيء آخر يمكن إضافته في python-shell:

  • دعم المكالمات غير المحظورة ؛
  • إمكانية التواصل التفاعلي مع الفريق (العمل مع stdin) ؛
  • إضافة خصائص جديدة (على سبيل المثال ، خاصية للحصول على العادم من stderr) ؛
  • تنفيذ كتالوج الأوامر المتاحة (للاستخدام مع وظيفة dir ()) ؛
  • إلخ

المراجع


  1. مكتبة Smart-env: Github و PyPI
  2. مكتبة Python-shell: github و pypi
  3. قناة برقية لتحديثات المكتبة


UPD 02/23/2020:
* تم نقل المستودعات ، تم تحديث الروابط المقابلة
* يتم إعداد نسخة python-shell == 1.0.1 للإصدار في 02/29/2020. من بين التغييرات دعم الإكمال التلقائي للأوامر وأمر dir (Shell) ، وإطلاق الأوامر بمعرف Python غير صالح ، وإصلاح الأخطاء.

UPD 03/01/2020:
* انشر في الإصدار التالي.

All Articles