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 ā un ā 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 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, un tieÅ”i analizÄt mainÄ«go vÄrtÄ«bas, izsaucot metodes veida
get_(mainÄ«gÄ_nosaukums)Vai arÄ« Å”is , kas tomÄr neatbalsta paÅ”reiz atpalikuÅ”o Python 2 (uz kura, neskatoties uz , 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 . 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 ā un ).
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:
- Vienots klase, kas iemieso Bash Python pasaulÄ;
- Katru Bash komandu izsauc kÄ Shell klases funkciju;
- Katras funkcijas izsaukuma parametri tiek nodoti attiecÄ«gÄs Bash komandas izsaukumam;
- Katra komanda tiek izpildÄ«ta "Å”eit un tagad" tÄs izsaukÅ”anas brÄ«dÄ«, t.i., tiek izmantots sinhronais pieejas veids;
- ir iespÄja piekļūt komandas izvadam stdout, kÄ arÄ« tÄs atgrieÅ”anas kodam;
- 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
- BibliotÄka smart-env: un
- BibliotÄka python-shell: un
- 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
