Python va Bash bilan do'stlashish: smart-env va python-shell kutubxonalari

Hammaga xayrli kun.

Bugungi kunda Python nafaqat dasturiy mahsulotlarni yaratish, balki ularning infratuzilmasini ta'minlash sohasida eng ko'p ishlatiladigan tillardan biridir. Natijada, ko'plab devoplar, ularning xohishiga ko'ra yoki unga qarshi bo'lsin, keyinchalik eski yaxshi Bash skriptlariga qo'shimcha sifatida foydalanish uchun yangi tilni o'rganishlari kerak edi. Biroq, Bash va Python kod yozishda turlicha yondashuvlarni tan olishadi va ma'lum xususiyatlarga ega, ya'ni Bash skriptlarini "ilon tiliga" o'tkazish ba'zan sig'imli va ahamiyatsiz vazifa bo'lib chiqadi.

Devoplar hayotini osonlashtirish uchun Python-da ko'plab foydali kutubxonalar va yordamchi dasturlar yaratilgan va yaratilishda davom etmoqda. Ushbu maqolada ushbu post muallifi tomonidan yaratilgan ikkita yangi kutubxona tasvirlangan - smart-env и piton qobig'i - va devoplarni Python bilan ishlashning nozik jihatlariga ko'p e'tibor berish zaruratidan xalos qilish uchun mo'ljallangan va qiziqarliroq vazifalar uchun joy qoldiradi. Kutubxonalarning faoliyat doirasi atrof-muhit o'zgaruvchilari va tashqi yordamchi dasturlarni ishga tushirishdir.

Kim qiziqsa, mushukni ko'ring.

Yangi "velosipedlar"?

Ko'rinib turibdiki, nega oddiy operatsiyalar uchun yangi paketlarni yaratish kerak? os.environ va subprocess.<usul yoki siz tanlagan sinf> to'g'ridan-to'g'ri foydalanishingizga nima xalaqit beradi?

Men kutubxonalarning har biri foydasiga alohida dalillar keltiraman.

smart-env kutubxonasi

O'z fikringizni yozishdan oldin, Internetga kirish va tayyor echimlarni izlash foydalidir. Albatta, kerakli narsani topa olmaslik xavfi bor, lekin bu "sug'urta hodisasi". Qoida tariqasida, bu yondashuv ishlaydi va ko'p vaqt va kuchni tejaydi.

Natijalarga ko'ra qidiruvi quyidagilar aniqlandi:

  • aslida os.environ ga qo'ng'iroqlarni o'rab oladigan paketlar mavjud, lekin bir vaqtning o'zida bir qator chalg'ituvchi harakatlarni talab qiladi (sinf namunasini yaratish, qo'ng'iroqlarda maxsus parametrlar va boshqalar);
  • Yaxshi paketlar mavjud, ammo ular ma'lum bir ekotizimga (asosan Django kabi veb-ramkalar) qat'iy bog'langan va shuning uchun faylsiz umuman universal emas;
  • yangi narsa qilish uchun kamdan-kam urinishlar mavjud. Masalan, yozishni qo'shing va kabi usullarni chaqirish orqali o'zgaruvchan qiymatlarni aniq tahlil qiling
    get_<typename>(var_name)

    Yoki bu yerda yana bir yechim, ammo bu hozir sharmanda bo'lgan Python 2 ni qo'llab-quvvatlamaydi (buga qaramay rasmiy RIP, hali ham yozma kod tog'lari va butun ekotizimlar mavjud);

  • Noma'lum sabablarga ko'ra PyPIning yuqori oqimiga tushib qolgan va faqat yangi paketlarni nomlash bilan bog'liq muammolarni keltirib chiqaradigan maktab o'quvchilarining hunarmandchiligi mavjud (xususan, "smart-env" nomi zaruriy choradir).

Va bu ro'yxat uzoq vaqt davom etishi mumkin. Biroq, yuqoridagi fikrlar meni qulay va universal narsa qilish g'oyasini hayajonlantirish uchun etarli edi.

smart-env yozishdan oldin o'rnatilgan talablar:

  • Eng oddiy foydalanish sxemasi
  • Osonlik bilan sozlanadigan ma'lumotlarni yozishni qo'llab-quvvatlash
  • Python 2.7 mos keladi
  • Sinovlar bilan yaxshi kod qamrovi

Oxir-oqibat, bularning barchasi amalga oshdi. Mana foydalanishga misol:

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

Misoldan ko'rinib turibdiki, yangi sinf bilan ishlash uchun siz uni import qilishingiz kerak bo'ladi (namunani yaratishingiz shart emas - qo'shimcha harakatni hisobga olmaganda). Har qanday muhit o'zgaruvchisiga kirish unga ENV sinfining o'zgaruvchisi sifatida murojaat qilish orqali erishiladi, bu aslida ushbu klassni mahalliy tizim muhiti uchun intuitiv o'ramga aylantiradi va bir vaqtning o'zida uni deyarli har qanday tizim uchun mumkin bo'lgan konfiguratsiya ob'ektiga aylantiradi ( shunga o'xshash yondashuv, masalan, Django da erishiladi, faqat u erda konfiguratsiya ob'ekti sozlamalar moduli/paketining o'zi).

Avtomatik yozishni qo'llab-quvvatlash rejimini yoqish/o'chirish ikkita usul yordamida amalga oshiriladi - enable_automatic_type_cast() va disable_automatic_type_cast(). Agar muhit o'zgaruvchisi ketma-ketlashtirilgan JSONga o'xshash ob'ektni yoki hatto oddiy mantiqiy konstantani o'z ichiga olsa, bu qulay bo'lishi mumkin (Djangoda DEBUG o'zgaruvchisini muhit o'zgaruvchisini "haqiqiy" satrlar bilan solishtirish orqali aniq belgilash - eng keng tarqalgan holatlardan biri). Ammo endi satrlarni aniq konvertatsiya qilishning hojati yo'q - kerakli harakatlarning aksariyati allaqachon kutubxonaning chuqurligiga kiritilgan va faqat harakat qilish uchun signalni kutmoqda. 🙂 Umuman olganda, yozish shaffof ishlaydi va deyarli barcha mavjud o'rnatilgan ma'lumotlar turlarini qo'llab-quvvatlaydi (frozenset, murakkab va baytlar sinovdan o'tkazilmagan).

Python 2-ni qo'llab-quvvatlash talabi deyarli hech qanday qurbonlarsiz amalga oshirildi (terish va Python 3-ning so'nggi versiyalarining ba'zi "shakar konfetlari" dan voz kechish), xususan, hamma joyda mavjud oltitalik tufayli (metaklasslardan foydalanish muammolarini hal qilish uchun) ).

Ammo ba'zi cheklovlar mavjud:

  • Python 3-ni qo'llab-quvvatlash 3.5 va undan yuqori versiyalarni bildiradi (ularning loyihangizda mavjudligi dangasalik yoki yaxshilanishlarga ehtiyoj yo'qligi natijasidir, chunki siz hali ham 3.4-da ekanligingizning ob'ektiv sababini topish qiyin);
  • Python 2.7 da kutubxona o'rnatilgan literallarning seriyasizlanishini qo'llab-quvvatlamaydi. Tavsif shu yerda. Lekin kimdir amalga oshirmoqchi bo'lsa, marhamat :);

Kutubxonada tahlil qilishda xatolar yuzaga kelgan taqdirda istisno mexanizmi ham mavjud. Agar satr mavjud analizatorlardan birortasi tomonidan tan olinmasa, qiymat satr bo'lib qoladi (to'g'rirog'i, qulaylik va o'zgaruvchilar Bashda qanday ishlashining odatiy mantig'i bilan orqaga qarab muvofiqligi sababli).

python-qobiq kutubxonasi

Endi men sizga ikkinchi kutubxona haqida gapirib beraman (mavjud analoglarning kamchiliklari tavsifini o'tkazib yuboraman - bu smart-env uchun tavsiflanganga o'xshaydi. Analoglar - shu yerda и shu yerda).

Umuman olganda, amalga oshirish g'oyasi va unga qo'yiladigan talablar smart-env uchun tavsiflanganlarga o'xshaydi, buni misoldan ko'rish mumkin:

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

G'oya shunday:

  1. Python dunyosida Bashni ifodalovchi yagona sinf;
  2. Har bir Bash buyrug'i Shell sinfining funktsiyasi sifatida chaqiriladi;
  3. Har bir funktsiya chaqiruvi parametrlari keyin tegishli Bash buyruq chaqiruviga o'tkaziladi;
  4. Har bir buyruq chaqirilgan paytda "bu erda va hozir" bajariladi, ya'ni. sinxron yondashuv ishlaydi;
  5. stdout-da buyruqning chiqishiga, shuningdek uning qaytish kodiga kirish mumkin;
  6. Agar buyruq tizimda bo'lmasa, istisno chiqariladi.

Smart-env-da bo'lgani kabi, Python 2-ni qo'llab-quvvatlash mavjud (garchi bir oz ko'proq qurbonlik qon talab qilingan bo'lsa-da) va Python 3.0-3.4-ni qo'llab-quvvatlamaydi.

Kutubxonani rivojlantirish rejalari

Siz hozir kutubxonalardan foydalanishingiz mumkin: ikkalasi ham rasmiy PyPI-da joylashtirilgan. Manbalar Github-da mavjud (pastga qarang).

Ikkala kutubxona ham qiziquvchilardan olingan fikr-mulohazalarni hisobga olgan holda ishlab chiqiladi. Va agar smart-env-da turli xil yangi xususiyatlarni topish qiyin bo'lishi mumkin bo'lsa, u holda python-shell-da qo'shadigan yana bir narsa bor:

  • bloklanmagan qo'ng'iroqlarni qo'llab-quvvatlash;
  • jamoa bilan interaktiv muloqot qilish imkoniyati (stdin bilan ishlash);
  • yangi xususiyatlarni qo'shish (masalan, stderr dan chiqishni olish xususiyati);
  • mavjud buyruqlar katalogini amalga oshirish (dir() funksiyasi bilan foydalanish uchun);
  • va hokazo.

Manbalar

  1. smart-env kutubxonasi: Github и PyPI
  2. python-qobiq kutubxonasi: Github и PyPI
  3. Telegram kanali kutubxona yangilanishlari

UPD 23.02.2020/XNUMX/XNUMX:
* Repozitariylar ko'chirildi, tegishli havolalar yangilandi
* Python-shell==1.0.1 versiyasi 29.02.2020/XNUMX/XNUMX da chiqarishga tayyorlanmoqda. Oʻzgarishlarga avtomatik toʻldirish va dir(Shell) buyrugʻini qoʻllab-quvvatlash, yaroqsiz Python identifikatori bilan buyruqlarni ishga tushirish va xatolarni tuzatish kiradi.

Manba: www.habr.com

a Izoh qo'shish