Apvienojam Python un Bash: bibliotēkas smart-env un python-shell

Sveiciens visiem.

Å odien Python ir viena no visvairāk izmantotajām valodām programmatÅ«ras produktu izstrādē, kā arÄ« to infrastruktÅ«ras nodroÅ”ināŔanā. Tādēļ daudziem DevOps speciālistiem, vai nu pēc savas gribas vai pretēji tam, nācās apgÅ«t jaunu valodu, lai to izmantotu kā papildinājumu sen zināmajiem Bash skriptiem. Tomēr Bash un Python ievēro dažādus pieejas principus kodēŔanai un tiem ir noteiktas Ä«paŔības, tāpēc Bash skriptu pārvērÅ”ana ā€œÄÅ«skas valodÄā€ dažreiz izrādās sarežģīta un ne vienkārÅ”a uzdevums.

Lai atvieglotu DevOps speciālistu dzÄ«vi, ir izveidots un turpina veidoties daudz noderÄ«gu bibliotēku un rÄ«ku Python valodā. Å is raksts apraksta divas jaunas bibliotēkas, ko radÄ«jusi Ŕī ieraksta autore — smart-env un python-shell — un tās ir paredzētas, lai atbrÄ«votu DevOps speciālistus no nepiecieÅ”amÄ«bas veltÄ«t daudz uzmanÄ«bas Python darba niansēm, atstājot vairāk vietas interesantākiem uzdevumiem. Bibliotēku darbÄ«bas joma ir vides mainÄ«gie un ārējo rÄ«ku palaiÅ”ana.

Kuros interesē, lūdzu, dodieties zemāk.

Jauni ā€žveloā€œ?

Izklausās dÄ«vaini, kāpēc veidot jaunus pakotnes triviālām operācijām? Kas traucē izmantot tieÅ”i os.environ un subprocess.?

PierādÄ«jumi par katru no bibliotēkām tiks sniegti atseviŔķi.

Bibliotēka smart-env

Pirms rakstÄ«t savējo izstrādājumu, ir noderÄ«gi palÅ«koties internetā pēc gataviem risinājumiem. Protams, pastāv risks, ka nevarēsiet atrast to, kas nepiecieÅ”ams, bet tas vairāk ir ā€œapdroÅ”ināŔanas gadÄ«jumsā€. Parasti pieeja izrādās efektÄ«va un ietaupa daudz laika un pūļu.

Saskaņā ar rezultātiem meklēŔanas bija atklātas Ŕādas lietas:

  • ir pakotnes, kas tieŔām iesaiņo izsaukumus uz os.environ, tomēr prasa daudz novērsto darbÄ«bu (klases eksemplāra izveidi, Ä«paÅ”as parametru izsaukums utt.);
  • ir pietiekami labas pakotnes, kas tomēr stingri saistÄ«tas ar noteiktu ekosistēmu (galvenokārt tÄ«mekļa ietvariem, piemēram, Django) un tāpēc bez pielāgoÅ”anas absolÅ«ti nav universālas;
  • ir retas mēģinājumi izveidot kaut ko jaunu. Piemēram, pievienot tipizāciju un tieÅ”i analizēt mainÄ«go vērtÄ«bas, izsaucot metodes veida
    get_(mainīgā_nosaukums)

    Vai arÄ« Å”is vēl viens risinājums, kas tomēr neatbalsta paÅ”reiz atpalikuÅ”o Python 2 (uz kura, neskatoties uz oficiālo R.I.P., joprojām ir milzums uzrakstÄ«ta koda un veselas ekosistēmas);

  • ir skolas un studiju projekti, kuriem nav skaidras jēgas, kāpēc tie atrodas augÅ”upejoÅ”ajā PyPI un tikai rada problēmas jaunu pakotņu nosaukumu izveidē (Ä«paÅ”i nosaukums Ā«smart-envĀ» — piespiedu pasākums).

Un Å”o sarakstu var turpināt nebeidzami. Tomēr iepriekÅ” minētie punkti bija pietiekami, lai aizdedzinātu ideju radÄ«t kaut ko ērtu un universālu.

Prasības, kas tika izvirzītas smart-env izstrādes priekŔā:

  • Maksimāli vienkārÅ”a lietoÅ”anas shēma
  • Vieglā konfigurējama datu tipa atbalsts
  • SaderÄ«ba ar Python 2.7
  • Laba koda pārklājuma pārbaudei

Beigās to visu izdevās Ä«stenot. Å eit ir lietoÅ”anas piemērs:

from smart_env import ENV

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

# pieņemot, ka jūs iestatījāt vides mainīgo MYVAR uz "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Ekvivalenti loģiskai True

ENV.NEW_VAR = 100  # Iestata jaunu vides mainīgo

Kā redzams piemērā, lai strādātu ar jauno klasi, pietiek to importēt (nav nepiecieÅ”ams izveidot instanci — tas ir nevajadzÄ«gs solis). Pieeja jebkuram vides mainÄ«gajam tiek panākta, pieprasot to kā ENV klases mainÄ«go, kas faktiski padara Å”o klasi intuitÄ«vi saprotamu nativā sistēmas vides iepakojumu, vienlaikus pārvērÅ”ot to par iespējamu konfigurācijas objekta variantu gandrÄ«z jebkurai sistēmai (lÄ«dzÄ«gs pieejas veids tiek Ä«stenots, piemēram, Django, tikai tur konfigurācijas objekts faktiski ir modulis/pakotne settings).

Automātiskās tipizācijas atbalsta ieslēgÅ”ana/izslēgÅ”ana tiek sasniegta, izmantojot divas metodes — enable_automatic_type_cast() un disable_automatic_type_cast(). Tas var bÅ«t ērti, ja vides mainÄ«gajā ir sērijveidots JSON lÄ«dzÄ«gs objekts vai pat vienkārÅ”a loÄ£iskā konstante (skatot mainÄ«go DEBUG Django, salÄ«dzinot vides mainÄ«go ar Ā«atzÄ«tāmĀ» virkņu — viens no bieži sastopamiem gadÄ«jumiem). Bet tagad nav nepiecieÅ”ams tieÅ”i pārvērst virknes — lielākā daļa nepiecieÅ”amo darbÄ«bu jau ir iekļauta bibliotēkas dziļumos un tikai gaida signālu darbÄ«bai. šŸ™‚ Kopumā tipizācija darbojas caurspÄ«dÄ«gi un atbalsta gandrÄ«z visus esoÅ”os iebÅ«vētos datu tipus (netika testēti frozenset, complex un bytes).

Python 2 atbalsta prasÄ«ba tika Ä«stenota praktiski bez upuriem (atsacoties no typing un dažām "saldajām konfektēm" jaunākajās Python 3 versijās), Ä«paÅ”i pateicoties visuresoÅ”ajam six (problēmu risināŔanai ar metaklases izmantoÅ”anu).

Bet ir arī daži ierobežojumi:

  • Python 3 atbalsts paredz versiju 3.5 un augstāku (to klātbÅ«tne jÅ«su projektā ir vai nu slinkuma, vai nepiecieÅ”amÄ«bas uzlabojumiem rezultāts, jo ir grÅ«ti izdomāt objektÄ«vu iemeslu, kāpēc jÅ«s joprojām izmantojat 3.4);
  • Python 2.7 bibliotēka neatbalsta kopu litterālu deserializāciju. Apraksts Å”eit. Bet, ja kāds vēlas to Ä«stenot — laipni lÅ«gts:);

Bibliotēka arÄ« paredz mehānismu izņēmumiem kļūdu parsēŔanas gadÄ«jumā. Ja rindu nav izdevies atpazÄ«t ne vienam no pieejamajiem analizatoriem, vērtÄ«ba paliek rindiņas (drÄ«zāk ērtÄ«bas un atpakaļsaderÄ«bas ar ierasto mainÄ«go loÄ£iku Bash dēļ).

Python-shell bibliotēka

Tagad pastāstīŔu par otro bibliotēku (trÅ«kumu aprakstu esoÅ”ajiem analogiem atstāŔu — tas ir lÄ«dzÄ«gs aprakstÄ«tajam smart-env. Analogi — Å”eit un Å”eit).

Kopumā, realizācijas ideja un prasības tai ir līdzīgas aprakstītajām smart-env, ko var redzēt piemēra piemērā:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Vienāds ar "ls -l $HOME"

command = Shell.whoami()  # Vienāds ar "whoami"
print(command.output)  # izdrukā jÅ«su paÅ”reizējo lietotājvārdu

print(command.command)  # izdrukā "whoami"
print(command.return_code)  # izdrukā "0"
print(command.arguments)  # izdrukā ""

Shell.mkdir('-p', '\/tmp\/new_folder')  # izveido jaunu mapi

Ideja ir Ŕāda:

  1. Vienots klase, kas iemieso Bash Python pasaulē;
  2. Katru Bash komandu izsauc kā Shell klases funkciju;
  3. Katras funkcijas izsaukuma parametri tiek nodoti attiecīgās Bash komandas izsaukumam;
  4. Katra komanda tiek izpildīta "Ŕeit un tagad" tās izsaukŔanas brīdī, t.i., tiek izmantots sinhronais pieejas veids;
  5. ir iespēja piekļūt komandas izvadam stdout, kā arÄ« tās atgrieÅ”anas kodam;
  6. Ja komanda sistēmā nav pieejama — tiek izmests izņēmums.

Kā arī smart-env gadījumā, tiek nodroŔināta Python 2 atbalsts (patiesībā, upuru asinis bija nedaudz vairāk), un nav atbalsta Python 3.0-3.4.

Bibliotēku attīstības plāni

Bibliotēkas var izmantot jau tagad: abas ir publicētas oficiālajā PyPI. Avota kodi ir pieejami GitHub (skatīt zemāk).

Abas bibliotēkas tiks attÄ«stÄ«tas, ņemot vērā intereÅ”u grupu atsauksmes. Un, ja smart-env varbÅ«t ir grÅ«ti izdomāt jaunu funkciju dažādÄ«bu, tad python-shell noteikti var vēl pievienot kaut ko jaunu:

  • atbalsts nenovērÅ”amiem izsaukumiem;
  • iespēja interaktÄ«vi komunicēt ar komandu (darbs ar stdin);
  • jaunu Ä«paŔību pievienoÅ”ana (piemēram, Ä«paŔība, lai saņemtu izeju no stderr);
  • pieejamo komandu katalogs (izmantoÅ”anai ar funkciju dir());
  • utt.

Saites

  1. Bibliotēka smart-env: Github un PyPI
  2. Bibliotēka python-shell: Github un PyPI
  3. Telegram kanāls bibliotēku atjauninājumiem

UPD 2020. gada 23. februārī:
* Repozitāri ir pārcelti, atbilstoŔās saites ir atjaunotas
* Versija python-shell==1.0.1 tiek gatavota iznākÅ”anai 2020. gada 29. februārÄ«. Izmaiņu vidÅ« ir atbalsts komandu automātiskajai pabeigÅ”anai un komandu dir(Shell), komandu izpilde ar Python nederÄ«gu identifikatoru, kā arÄ« kļūdu labojumi.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster