Python un Bash draudzÄ«bas veidoÅ”ana: smart-env un python-shell bibliotÄkas
Laba diena visiem.
MÅ«sdienÄs Python ir viena no visvairÄk izmantotajÄm valodÄm ne tikai paÅ”u programmatÅ«ras produktu radÄ«Å”anÄ, bet arÄ« to infrastruktÅ«ras nodroÅ”inÄÅ”anÄ. RezultÄtÄ daudziem devopiem pÄc savas gribas vai pret to bija jÄiemÄcÄs jauna valoda, lai vÄlÄk to izmantotu kÄ papildinÄjumu vecajiem labajiem BaÅ”a skriptiem. TomÄr Bash un Python izmanto dažÄdas pieejas koda rakstÄ«Å”anai, un tiem ir noteiktas funkcijas, kas nozÄ«mÄ, ka Bash skriptu pÄrneÅ”ana uz āÄÅ«skas valoduā dažkÄrt izrÄdÄs ietilpÄ«gs un nebÅ«t ne triviÄls uzdevums.
Lai atvieglotu devops dzÄ«vi, Python ir izveidotas un tiek veidotas daudzas noderÄ«gas bibliotÄkas un utilÄ«tas. Å ajÄ rakstÄ ir aprakstÄ«tas divas jaunas bibliotÄkas, ko izveidojis Ŕīs ziÅas autors - smart-env Šø python-Äaula - un paredzÄts, lai atbrÄ«votu devops no nepiecieÅ”amÄ«bas pievÄrst lielu uzmanÄ«bu darba ar Python sarežģītÄ«bÄm, atstÄjot vietu interesantÄkiem uzdevumiem. BibliotÄku darbÄ«bas joma ir vides mainÄ«gie un ÄrÄjo utilÄ«tu palaiÅ”ana.
Ikviens interesents, lūdzu, skatiet kaķi.
Jauni "velosipÄdi"?
Å Ä·iet, kÄpÄc izveidot jaunas paketes diezgan parastÄm darbÄ«bÄm? Kas jums traucÄ tieÅ”i izmantot os.environ un subprocess.<method or class of your choice>?
Es sniegÅ”u pierÄdÄ«jumus par labu katrai no bibliotÄkÄm atseviŔķi.
smart-env bibliotÄka
Pirms rakstÄ«t savu ideju, ir lietderÄ«gi ieiet tieÅ”saistÄ un meklÄt gatavus risinÄjumus. Protams, pastÄv risks neatrast vajadzÄ«go, taÄu tas drÄ«zÄk ir āapdroÅ”inÄÅ”anas gadÄ«jumsā. Parasti Ŕī pieeja darbojas un ietaupa daudz laika un pūļu.
SaskaÅÄ ar rezultÄtiem meklÄÅ”ana atklÄjÄs sekojoÅ”ais:
ir pakotnes, kas faktiski aplauza izsaukumus uz os.environ, bet tajÄ paÅ”Ä laikÄ prasa virkni traucÄjoÅ”u darbÄ«bu (klases instances izveide, Ä«paÅ”i parametri izsaukumos utt.);
Ir labas pakotnes, kuras tomÄr ir stingri piesaistÄ«tas konkrÄtai ekosistÄmai (galvenokÄrt tÄ«mekļa ietvariem, piemÄram, Django), un tÄpÄc bez faila nepavisam nav universÄlas;
ir reti mÄÄ£inÄjumi izdarÄ«t ko jaunu. PiemÄram, pievienot rakstÄ«Å”anu un skaidri parsÄt mainÄ«gÄs vÄrtÄ«bas, izsaucot tÄdas metodes kÄ
get_<typename>(var_name)
Vai Å”eit vÄl viens risinÄjums, kas tomÄr neatbalsta tagad apkaunoto Python 2 (kas, neskatoties uz to oficiÄlais RIP, joprojÄm ir rakstÄ«ta koda kalni un veselas ekosistÄmas);
Ir skolnieku amatniecÄ«ba, kas nezinÄma iemesla dÄļ nokļuva augÅ”upÄjÄ PyPI un rada problÄmas tikai ar jaunu pakotÅu nosaukumu pieŔķirÅ”anu (jo Ä«paÅ”i nosaukums āsmart-envā ir nepiecieÅ”ams pasÄkums).
Un Å”o sarakstu var turpinÄt vÄl ilgi. TomÄr ar iepriekÅ”minÄtajiem punktiem pietika, lai mani sajÅ«sminÄtu ideja izveidot kaut ko Ärtu un universÄlu.
Prasības, kas tika noteiktas pirms smart-env rakstīŔanas:
VienkÄrÅ”ÄkÄ lietoÅ”anas shÄma
Viegli konfigurÄjams datu ievadÄ«Å”anas atbalsts
Saderīgs ar Python 2.7
Labs koda pÄrklÄjums ar testiem
Galu galÄ tas viss tika realizÄts. Å eit ir lietoÅ”anas piemÄrs:
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
KÄ redzams no piemÄra, lai strÄdÄtu ar jaunu klasi, tÄ vienkÄrÅ”i ir jÄimportÄ (jums nav jÄizveido instance ā atskaitot papildu darbÄ«bu). Piekļuve jebkuram vides mainÄ«gajam tiek panÄkta, atsaucoties uz to kÄ uz ENV klases mainÄ«go, kas faktiski padara Å”o klasi par intuitÄ«vu sÄkotnÄjÄs sistÄmas vides iesaiÅojumu, vienlaikus pÄrvÄrÅ”ot to par iespÄjamu konfigurÄcijas objektu gandrÄ«z jebkurai sistÄmai ( lÄ«dzÄ«ga pieeja, piemÄram, tiek panÄkta Django , tikai tur konfigurÄcijas objekts ir pats iestatÄ«jumu modulis/pakete).
AutomÄtiskÄs rakstÄ«Å”anas atbalsta režīma iespÄjoÅ”ana/atspÄjoÅ”ana tiek panÄkta, izmantojot divas metodes - enable_automatic_type_cast() un disable_automatic_type_cast(). Tas var bÅ«t Ärti, ja vides mainÄ«gais satur serializÄtu JSON lÄ«dzÄ«gu objektu vai pat tikai BÅ«la konstanti (viens no visizplatÄ«tÄkajiem gadÄ«jumiem ir Django mainÄ«gÄ DEBUG iestatÄ«Å”ana, salÄ«dzinot vides mainÄ«go ar āderÄ«gÄmā virknÄm). TaÄu tagad nav vajadzÄ«bas nepÄrprotami konvertÄt virknes - lielÄkÄ daļa nepiecieÅ”amo darbÄ«bu jau ir iestrÄdÄtas bibliotÄkas dziļumos un tikai gaida signÄlu rÄ«koties. š KopumÄ rakstÄ«Å”ana darbojas caurspÄ«dÄ«gi un atbalsta gandrÄ«z visus pieejamos iebÅ«vÄtos datu tipus (netika pÄrbaudÄ«ti iesaldÄtie, kompleksie un baiti).
PrasÄ«ba atbalstÄ«t Python 2 tika Ä«stenota praktiski bez upuriem (atteikÅ”anÄs no maŔīnrakstÄ«Å”anas un dažÄm Python 3 jaunÄko versiju ācukurkonfektÄmā), jo Ä«paÅ”i pateicoties visuresoÅ”ajam seÅ”iniekam (lai atrisinÄtu metaklases lietoÅ”anas problÄmas ).
Bet ir daži ierobežojumi:
Python 3 atbalsts nozÄ«mÄ versiju 3.5 un jaunÄku versiju (to klÄtbÅ«tne jÅ«su projektÄ ir slinkuma vai uzlabojumu trÅ«kuma rezultÄts, jo ir grÅ«ti izdomÄt objektÄ«vu iemeslu, kÄpÄc jÅ«s joprojÄm izmantojat 3.4);
Python versijÄ 2.7 bibliotÄka neatbalsta iestatÄ«to literÄļu deserializÄciju. Apraksts Å”eit. Bet, ja kÄds vÄlas to Ä«stenot, laipni lÅ«gts :);
BibliotÄkai ir arÄ« izÅÄmuma mehÄnisms parsÄÅ”anas kļūdu gadÄ«jumÄ. Ja virkni nevar atpazÄ«t neviens no pieejamajiem analizatoriem, vÄrtÄ«ba paliek virkne (drÄ«zÄk ÄrtÄ«bas un atpakaļsaderÄ«bas ar parasto mainÄ«go darbÄ«bas loÄ£iku Bash dÄļ).
python-shell bibliotÄka
Tagad es jums pastÄstÄ«Å”u par otro bibliotÄku (es izlaidÄ«Å”u esoÅ”o analogu trÅ«kumu aprakstu - tÄ ir lÄ«dzÄ«ga tai, kas aprakstÄ«ta smart-env. Analogiem - Å”eit Šø Å”eit).
KopumÄ ievieÅ”anas ideja un prasÄ«bas tai ir lÄ«dzÄ«gas tÄm, kas aprakstÄ«tas smart-env, kÄ redzams no piemÄra:
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
Ideja ir Å”Äda:
Viena klase, kas pÄrstÄv BaÅ”u Python pasaulÄ;
Katra Bash komanda tiek izsaukta kÄ Shell klases funkcija;
PÄc tam katra funkcijas izsaukuma parametri tiek nodoti atbilstoÅ”ajam Bash komandas izsaukumam;
Katra komanda tiek izpildÄ«ta āÅ”eit un tagadā tÄs izsaukÅ”anas brÄ«dÄ«, t.i. darbojas sinhronÄ pieeja;
stdout ir iespÄjams piekļūt komandas izvadei, kÄ arÄ« tÄs atgrieÅ”anas kodam;
Ja komandas nav sistÄmÄ, tiek izmests izÅÄmums.
TÄpat kÄ smart-env, ir atbalsts Python 2 (lai gan bija nepiecieÅ”ams nedaudz vairÄk upurÄtu asiÅu), un Python 3.0ā3.4 netiek atbalstÄ«ts.
BibliotÄkas attÄ«stÄ«bas plÄni
BibliotÄkas varat izmantot tagad: abas ir publicÄtas oficiÄlajÄ PyPI. Avoti ir pieejami vietnÄ Github (skatÄ«t zemÄk).
Abas bibliotÄkas tiks attÄ«stÄ«tas, Åemot vÄrÄ interesentu apkopotÄs atsauksmes. Un, ja smart-env var bÅ«t grÅ«ti piedÄvÄt dažÄdas jaunas funkcijas, tad python-shell noteikti ir jÄpievieno vÄl kaut kas:
atbalsts nebloÄ·ÄjoÅ”iem zvaniem;
interaktÄ«vÄs komunikÄcijas iespÄja ar komandu (darbs ar stdin);
jaunu rekvizÄ«tu pievienoÅ”ana (piemÄram, rekvizÄ«ts, lai saÅemtu izvadi no stderr);
pieejamo komandu direktorija ievieŔana (izmantoŔanai ar funkciju dir());
UPD 23.02.2020:
* KrÄtuves ir pÄrvietotas, atbilstoÅ”Äs saites ir atjauninÄtas
* Versija python-shell==1.0.1 tiek sagatavota izlaiÅ”anai 29.02.2020. IzmaiÅas ietver komandu automÄtiskÄs pabeigÅ”anas un dir(Shell) komandas atbalstu, komandu izpildi ar nederÄ«gu Python identifikatoru un kļūdu labojumus.