„Python“ ir „Bash“ draugystės kūrimas: „Smart-env“ ir „python-shell“ bibliotekos

Laba diena, visi.

Šiandien Python yra viena iš dažniausiai naudojamų kalbų kuriant ne tik pačius programinės įrangos produktus, bet ir teikiant jų infrastruktūrą. Dėl to daugelis devopų, savo noru ar prieš tai, turėjo išmokti naują kalbą, kad vėliau galėtų ją naudoti kaip senų gerų Bašo raštų priedą. Tačiau „Bash“ ir „Python“ išpažįsta skirtingus metodus, kaip rašyti kodą, ir turi tam tikrų savybių, o tai reiškia, kad Bash scenarijų perkėlimas į „gyvatės kalbą“ kartais pasirodo esanti talpi ir toli gražu ne triviali užduotis.

Siekiant palengvinti „devops“ gyvenimą, „Python“ buvo sukurta ir toliau kuriama daug naudingų bibliotekų ir paslaugų. Šiame straipsnyje aprašomos dvi naujos šio įrašo autoriaus sukurtos bibliotekos - smart-env и python apvalkalas - ir skirtas atleisti devops nuo būtinybės daug dėmesio skirti darbo su Python subtilybėms, paliekant vietos įdomesnėms užduotims. Bibliotekų veiklos sritis – aplinkos kintamieji ir išorinių komunalinių paslaugų paleidimas.

Kas domisi, prašome pamatyti katę.

Nauji „dviračiai“?

Atrodytų, kam kurti naujus paketus gana įprastoms operacijoms? Kas trukdo tiesiogiai naudoti os.environ ir subprocess.<method or class of your choice>?

Pateiksiu įrodymus kiekvienai bibliotekai atskirai.

smart-env biblioteka

Prieš rašant savo mintis, pravartu prisijungti prie interneto ir paieškoti paruoštų sprendimų. Žinoma, yra rizika nerasti to, ko jums reikia, tačiau tai veikiau „draudiminis įvykis“. Paprastai šis metodas veikia ir sutaupo daug laiko bei pastangų.

Pagal rezultatus paieška paaiškėjo:

  • yra paketų, kurie iš tikrųjų apvynioja iškvietimus į os.environ, bet tuo pačiu reikalauja daugybės dėmesį atitraukiančių veiksmų (klasės egzemplioriaus kūrimas, specialūs parametrai skambučiuose ir pan.);
  • Yra gerų paketų, kurie vis dėlto yra griežtai susieti su konkrečia ekosistema (daugiausia žiniatinklio sistemomis, tokiomis kaip „Django“) ir todėl nėra universalūs be failo;
  • retai bandoma padaryti ką nors naujo. Pavyzdžiui, pridėti spausdinimą ir aiškiai išanalizuoti kintamųjų reikšmes iškviesdami tokius metodus kaip
    get_<typename>(var_name)

    Arba čia dar vienas sprendimas, kuri vis dėlto nepalaiko dabar apgailėtino Python 2 (kuris, nepaisant oficialus RIP, vis dar yra kalnai rašytinio kodo ir ištisos ekosistemos);

  • Yra mokinių ir mokinių amatų, kurie dėl kažkokios nežinomos priežasties atsidūrė ankstesniame PyPI ir sukelia problemų tik suteikiant naujų paketų pavadinimus (ypač pavadinimas „smart-env“ yra būtina priemonė).

Ir šį sąrašą galima tęsti ilgai. Tačiau minėtų punktų pakako, kad mane sužavėtų idėja padaryti ką nors patogaus ir universalaus.

Reikalavimai, kurie buvo nustatyti prieš rašant smart-env:

  • Paprasčiausia naudojimo schema
  • Lengvai konfigūruojamas duomenų įvedimo palaikymas
  • Suderinamas su Python 2.7
  • Geras kodo aprėptis atliekant testus

Galiausiai visa tai buvo įgyvendinta. Štai naudojimo pavyzdys:

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

Kaip matote iš pavyzdžio, norint dirbti su nauja klase, tereikia ją importuoti (nereikia kurti egzemplioriaus – atėmus papildomą veiksmą). Prieiga prie bet kurio aplinkos kintamojo pasiekiama nurodant jį kaip ENV klasės kintamąjį, o tai iš tikrųjų daro šią klasę intuityviu pradinės sistemos aplinkos paketu, tuo pačiu paverčiant ją galimu konfigūracijos objektu beveik bet kuriai sistemai ( panašus požiūris, pavyzdžiui, pasiekiamas Django , tik ten konfigūracijos objektas yra pats nustatymų modulis / paketas).

Automatinio spausdinimo palaikymo režimas įjungiamas / išjungiamas naudojant du metodus - enable_automatic_type_cast() ir disable_automatic_type_cast(). Tai gali būti patogu, jei aplinkos kintamajame yra suskirstytas į JSON panašus objektas arba net tik Būlio konstanta (vienas iš dažniausiai pasitaikančių atvejų yra aiškiai nustatyti DEBUG kintamąjį „Django“, lyginant aplinkos kintamąjį su „galiojančiomis“ eilutėmis). Tačiau dabar nereikia aiškiai konvertuoti eilučių – dauguma reikalingų veiksmų jau yra įterpti į bibliotekos gilumą ir tik laukia signalo veikti. 🙂 Apskritai spausdinimas veikia skaidriai ir palaiko beveik visus galimus įmontuotus duomenų tipus (nebuvo tikrinami fiksuoti, kompleksiniai ir baitai).

Reikalavimas palaikyti Python 2 buvo įgyvendintas praktiškai be aukų (atsisakymas rašyti ir kai kurių „cukrinių saldainių“ naujausiose Python 3 versijose), ypač dėl visur esančių šešių (siekiant išspręsti metaklasių naudojimo problemas). ).

Tačiau yra keletas apribojimų:

  • Python 3 palaikymas reiškia 3.5 ir naujesnę versiją (jų buvimas jūsų projekte yra arba dėl tinginystės, arba dėl to, kad nereikia tobulinti, nes sunku sugalvoti objektyvią priežastį, kodėl vis dar naudojate 3.4 versiją);
  • Python 2.7 versijoje biblioteka nepalaiko nustatytų literalų deserializavimo. apibūdinimas čia. Bet jei kas nori tai įgyvendinti, laukiame :);

Bibliotekoje taip pat yra išimčių mechanizmas analizavimo klaidų atveju. Jei eilutės negali atpažinti nė vienas iš galimų analizatorių, reikšmė lieka eilute (dėl patogumo ir atgalinio suderinamumo su įprasta kintamųjų veikimo „Bash“ logika).

Python-shell biblioteka

Dabar papasakosiu apie antrąją biblioteką (praleisiu esamų analogų trūkumų aprašymą - ji panaši į aprašytą smart-env. Analogai - čia и čia).

Apskritai diegimo idėja ir jai keliami reikalavimai yra panašūs į tuos, kurie aprašyti „smart-env“, kaip matyti iš pavyzdžio:

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

Idėja tokia:

  1. Viena klasė, atstovaujanti Bash Python pasaulyje;
  2. Kiekviena Bash komanda iškviečiama kaip Shell klasės funkcija;
  3. Tada kiekvieno funkcijos iškvietimo parametrai perduodami į atitinkamą Bash komandos iškvietimą;
  4. Kiekviena komanda vykdoma „čia ir dabar“ jos iškvietimo momentu, t.y. veikia sinchroninis metodas;
  5. galima pasiekti komandos išvestį stdout, taip pat jos grąžinimo kodą;
  6. Jei komandos nėra sistemoje, išmetama išimtis.

Kaip ir „smart-env“, yra „Python 2“ palaikymas (nors reikėjo šiek tiek daugiau aukoti kraujo), o Python 3.0–3.4 nepalaiko.

Bibliotekos plėtros planai

Bibliotekomis galite naudotis dabar: abi yra paskelbtos oficialiame PyPI. Šaltinius galima rasti Github (žr. toliau).

Abi bibliotekos bus kuriamos atsižvelgiant į surinktus atsiliepimus iš besidominčių. Ir jei gali būti sunku sugalvoti daugybę naujų „smart-env“ funkcijų, „python-shell“ tikrai reikia pridėti ką nors kita:

  • neblokuojančių skambučių palaikymas;
  • galimybė interaktyviai bendrauti su komanda (darbas su stdin);
  • naujų ypatybių pridėjimas (pavyzdžiui, ypatybė gauti išvestį iš stderr);
  • galimų komandų katalogo įgyvendinimas (skirtas naudoti su dir() funkcija);
  • ir tt

Nuorodos

  1. smart-env biblioteka: GitHub и PyPI
  2. Python-shell biblioteka: GitHub и PyPI
  3. Telegramos kanalas bibliotekos atnaujinimai

UPD 23.02.2020-XNUMX-XNUMX:
* Saugyklos buvo perkeltos, atitinkamos nuorodos atnaujintos
* Versija python-shell==1.0.1 ruošiama išleisti 29.02.2020-XNUMX-XNUMX. Pakeitimai apima komandų automatinio užbaigimo ir dir(Shell) komandos palaikymą, komandų vykdymą su netinkamu Python identifikatoriumi ir klaidų pataisymus.

Šaltinis: www.habr.com

Добавить комментарий