صنع صداقة بايثون وباش: مكتبات Smart-env وPython-Shell

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

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

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

أي شخص مهتم، يرجى الاطلاع على القط.

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

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

وسأقدم الأدلة لصالح كل مكتبة على حدة.

مكتبة سمارت إنف

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

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

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

    أو هنا حل آخر، والذي، مع ذلك، لا يدعم Python 2 المشين الآن (والذي، على الرغم من مزق الرسمي، لا تزال هناك جبال من التعليمات البرمجية المكتوبة والأنظمة البيئية بأكملها)؛

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

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

المتطلبات التي تم تحديدها قبل كتابة Smart-env:

  • مخطط الاستخدام الأكثر بساطة
  • دعم كتابة البيانات القابلة للتكوين بسهولة
  • متوافق مع بايثون 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 من خلال مقارنة متغير البيئة بسلاسل "صالحة" أحد أكثر الحالات شيوعًا). ولكن الآن ليست هناك حاجة لتحويل السلاسل بشكل صريح - فمعظم الإجراءات الضرورية مضمنة بالفعل في أعماق المكتبة وتنتظر فقط إشارة للعمل. 🙂 بشكل عام، تعمل الكتابة بشفافية وتدعم تقريبًا جميع أنواع البيانات المضمنة المتوفرة (لم يتم اختبار مجموعة البيانات المجمدة والمعقدة والبايت).

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

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

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

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

مكتبة بايثون شل

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

بشكل عام، فكرة التنفيذ والمتطلبات الخاصة بها تشبه تلك الموصوفة لـ 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 الرسمي. المصادر متاحة على جيثب (انظر أدناه).

سيتم تطوير كلتا المكتبتين مع الأخذ في الاعتبار التعليقات التي تم جمعها من المهتمين. وإذا كان من الصعب التوصل إلى مجموعة متنوعة من الميزات الجديدة في Smart-env، فمن المؤكد أن هناك شيئًا آخر يمكن إضافته في python-Shell:

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

مراجع

  1. مكتبة البيئة الذكية: جيثب и PyPI
  2. مكتبة بايثون شل: جيثب и PyPI
  3. قناة برقية تحديثات المكتبة

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

المصدر: www.habr.com

إضافة تعليق