ساختن دوستی پایتون و باش: کتابخانه‌های smart-env و python-shell

روز همگی بخیر

امروزه پایتون یکی از پرکاربردترین زبان ها در زمینه ایجاد نه تنها خود محصولات نرم افزاری، بلکه در ارائه زیرساخت های آنهاست. در نتیجه، بسیاری از توسعه دهندگان، چه به میل خود و چه بر خلاف آن، مجبور شدند زبان جدیدی را برای استفاده بعدی به عنوان مکمل اسکریپت های خوب قدیمی Bash یاد بگیرند. با این حال، Bash و Python رویکردهای متفاوتی برای نوشتن کد دارند و ویژگی‌های خاصی دارند، به این معنی که انتقال اسکریپت‌های Bash به «زبان مار» گاهی اوقات کاری بزرگ و به دور از بی‌اهمیت به نظر می‌رسد.

برای آسان‌تر کردن زندگی برای devops، بسیاری از کتابخانه‌ها و ابزارهای مفید در پایتون ایجاد شده‌اند و همچنان ایجاد می‌شوند. این مقاله دو کتابخانه جدید ایجاد شده توسط نویسنده این پست را شرح می دهد - smart-env и پیتون-شل - و برای رهایی از نیاز به توجه زیاد به پیچیدگی های کار با پایتون طراحی شده است و فضایی برای کارهای جالب تر باقی می گذارد. حوزه فعالیت کتابخانه ها متغیرهای محیطی و راه اندازی ابزارهای خارجی است.

هر کسی علاقه مند است، لطفا گربه را ببینید.

دوچرخه های جدید؟

به نظر می رسد، چرا بسته های جدید برای عملیات نسبتاً معمولی ایجاد می کنیم؟ چه چیزی شما را از استفاده مستقیم از os.environ و subprocess.<روش یا کلاس انتخابی شما باز می دارد؟

من شواهدی به نفع هر یک از کتابخانه ها به طور جداگانه ارائه خواهم کرد.

کتابخانه smart-env

قبل از نوشتن ایده خود، مفید است که آنلاین شوید و به دنبال راه حل های آماده باشید. البته، این خطر وجود دارد که آنچه را که نیاز دارید پیدا نکنید، اما این بیشتر یک "رویداد بیمه" است. به عنوان یک قاعده، این روش کار می کند و باعث صرفه جویی در زمان و تلاش زیادی می شود.

با توجه به نتایج جستجو کردن موارد زیر آشکار شد:

  • بسته هایی وجود دارند که در واقع فراخوانی ها را به os.environ می بندند، اما در عین حال به مجموعه ای از اقدامات منحرف کننده (ایجاد نمونه ای از یک کلاس، پارامترهای خاص در تماس ها و غیره) نیاز دارند.
  • بسته های خوبی وجود دارد که با این حال، به شدت به یک اکوسیستم خاص (عمدتا چارچوب های وب مانند جنگو) گره خورده اند و بنابراین بدون فایل به هیچ وجه جهانی نیستند.
  • تلاش های نادری برای انجام کاری جدید وجود دارد. مثلا، اضافه کردن تایپ و به صراحت مقادیر متغیر را با فراخوانی متدهایی مانند
    get_<typename>(var_name)

    یا اینجا یک راه حل دیگر، که با این حال از Python 2 که اکنون رسوا شده است (که با وجود RIP رسمی، هنوز کوه هایی از کد نوشته شده و اکوسیستم های کامل وجود دارد).

  • صنایع دستی دانش آموزی وجود دارد که به دلایل نامعلومی به 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 حاصل می شود، که در واقع، این کلاس را به یک پوشش بصری برای محیط سیستم بومی تبدیل می کند، در حالی که به طور همزمان آن را به یک شی پیکربندی ممکن برای تقریباً هر سیستم تبدیل می کند. یک رویکرد مشابه، برای مثال، در جنگو به دست می‌آید، فقط در آنجا شی پیکربندی، خود ماژول/بسته تنظیمات است.

فعال کردن/غیرفعال کردن حالت پشتیبانی تایپ خودکار با استفاده از دو روش به دست می‌آید - enable_automatic_type_cast() و disable_automatic_type_cast(). اگر متغیر محیطی حاوی یک شیء سریالی JSON مانند یا حتی فقط یک ثابت بولی باشد، این می تواند راحت باشد (تنظیم صریح متغیر DEBUG در جنگو با مقایسه متغیر محیطی با رشته های "معتبر" یکی از رایج ترین موارد است). اما در حال حاضر نیازی به تبدیل صریح رشته ها نیست - بیشتر اقدامات لازم از قبل در اعماق کتابخانه تعبیه شده است و فقط منتظر یک سیگنال برای عمل هستند. 🙂 به طور کلی، تایپ شفاف کار می کند و تقریباً از همه انواع داده های داخلی موجود پشتیبانی می کند (تجمیع، پیچیده و بایت ها آزمایش نشدند).

نیاز به پشتیبانی از پایتون 2 تقریباً بدون هیچ گونه فداکاری اجرا شد (ترک کردن تایپ و برخی از "آب نبات های قند" آخرین نسخه های پایتون 3)، به ویژه به لطف شش مورد همه جا حاضر (برای حل مشکلات استفاده از متاکلاس ها) ).

اما محدودیت هایی وجود دارد:

  • پشتیبانی از Python 3 به معنای نسخه 3.5 و بالاتر است (حضور آنها در پروژه شما نتیجه تنبلی یا عدم نیاز به بهبود است، زیرا یافتن دلیل عینی برای اینکه چرا هنوز در 3.4 هستید دشوار است).
  • در Python 2.7، کتابخانه از سریال‌زدایی از مجموعه‌ها پشتیبانی نمی‌کند. شرح اینجا. ولی اگه کسی بخواد اجرا کنه خوش اومدی :);

کتابخانه همچنین دارای مکانیزم استثنایی در صورت بروز خطاهای تجزیه است. اگر رشته توسط هیچ یک از تحلیلگرهای موجود قابل شناسایی نباشد، مقدار یک رشته باقی می ماند (به جای اینکه به دلایل راحتی و سازگاری با منطق معمول نحوه کار متغیرها در Bash).

کتابخانه python-shell

اکنون در مورد کتابخانه دوم به شما می گویم (توضیح کاستی های آنالوگ های موجود را حذف می کنم - شبیه به آنچه برای 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. یک کلاس واحد که Bash را در دنیای پایتون نشان می دهد.
  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: گیتهاب и PyPI
  2. کتابخانه python-shell: گیتهاب и PyPI
  3. کانال تلگرام به روز رسانی کتابخانه

UPD23.02.2020:
* مخازن منتقل شده اند، پیوندهای مربوطه به روز شده اند
* نسخه python-shell==1.0.1 برای انتشار در 29.02.2020/XNUMX/XNUMX آماده می شود. تغییرات شامل پشتیبانی از تکمیل خودکار فرمان و دستور dir(Shell)، اجرای دستورات با شناسه پایتون نامعتبر و رفع اشکال است.

منبع: www.habr.com

اضافه کردن نظر