Tere kÔigile.
Praegu on Python ĂŒks enimkasutatavaid keeli mitte ainult tarkvaratoodete arendamisel, vaid ka nende infrastruktuuri haldamisel. SeetĂ”ttu on paljudel devopsidel, kas oma soovil vĂ”i mitte, tulnud Ă”ppida uus keel, et seda kasutada vanade heade Bash-skriptide tĂ€iendusena. Siiski jĂ€rgivad Bash ja Python erinevaid lĂ€henemisviise koodi kirjutamisele ning neil on omad eripĂ€rad, mistĂ”ttu Bash-skriptide portimine "madala keele" peale osutub mĂ”nikord mahukaks ja kaugel sellest, et oleks triviaalne ĂŒlesanne.
Devopside elu lihtsamaks tegemiseks on loodud ja luuakse jĂ€tkuvalt palju kasulikke Python'i raamatukogusid ja utiliite. KĂ€esolev artikkel kirjeldab kahte uut raamatukogu, mille on loonud kĂ€esoleva postituse autor â ja â ja mille eesmĂ€rk on vabastada devops vajadusest pöörata palju tĂ€helepanu Python'i töö nĂŒanssidele, jĂ€ttes ruumi huvitavamatele ĂŒlesannetele. Raamatukogude tegevusvaldkond on keskkonnamuutujad ja vĂ€liste utiliitide kĂ€ivitamine.
Kellele huvi pakub, palun lugeda edasi.
Uued 'jalgrattad'?
Tundub, et millestki nii tavalise toimingu jaoks uusi pakette luua? Mis takistab otse os.environ'i ja subprocess. kasutamast?
TÔendeid iga raamatukogu kasuks toome eraldi.
Raamatukogu smart-env
Enne kui kirjutada oma loomingut, on kasulik uurida Internetti ja otsida valmislahendusi. Loomulikult on risk, et vajalikku ei leia, kuid see on pigem "kindlustusjuhtum". Reeglina toimib lÀhenemine ja sÀÀstab palju aega ja vaeva.
Uuringute pÔhjal tuletas vÀlja jÀrgmist:
- on pakette, mis tĂ”epoolest ĂŒmbritsevad os.environ'i kutseid, kuid samas nĂ”uavad palju segavaid tegevusi (klasside loomine, spetsiaalsetele parameetritele vastamine jne);
- on hĂ€id pakette, kuid need on rangelt seotud kindla ökosĂŒsteemiga (peamiselt veebiraamistike nagu Django) ning seetĂ”ttu ei ole nad ĂŒldiselt universaalsed;
- on haruldasi katseid midagi uut teha. NĂ€iteks, ja analĂŒĂŒsida muutujaid selgelt, kutsudes esile meetodeid tĂŒĂŒpi
get_(var_name)VĂ”i veel ĂŒks lahendus , mis siiski ei toeta enam kasutuses olevat Python 2 (millel, vaatamata sellele, , koodimĂ€gedest ja tervetest ökosĂŒsteemidest, mis on endiselt alles);
- on olemas kooli-ĂŒliĂ”pilaste teosed, millel pole selget eesmĂ€rki, et nad on sattunud upstream'i PyPI'sse ja ainult segavad uute pakettide nimetamisel (eriti, nimi âsmart-envâ â sunnitud meede).
Ja seda nimekirja vÔiks jÀtkata pikalt. Siiski, juba eespool nimetatud punktide jÀrgi tekkis idee luua midagi mugavat ja universaalset.
NÔuded, mis esitleti smart-env'i kirjutamiseks:
- Maksimaalselt lihtne kasutusmudel
- Kergesti konfigureeritav andmetĂŒĂŒpide tugi
- Ăhildub Python 2.7-ga
- Hea koodikatete testidega
LÔpuks suudeti kÔik see ellu viia. Siin on kasutusnÀide:
from smart_env import ENV
print(ENV.HOME) # Ăksikasju: print(os.environ['HOME'])
# eeldades, et seadistate keskkonnamuutuja MYVAR vÀÀrtuseks "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Ăksikasju: boolean True
ENV.NEW_VAR = 100 # Seab uue keskkonnamuutuja
Nagu nĂ€ha nĂ€ites, on uue klassiga töötamiseks piisav selle importimine (instantsi loomine pole vajalik â vĂ€hem tarbetuid toiminguid). JuurdepÀÀs mis tahes keskkonnamuutujale toimub klassi ENV muutuja kaudu, mis tegelikult teeb sellest klassist intuitiivselt arusaadava mĂ€hise native sĂŒsteemi keskkonnale, samal ajal muutes selle vĂ”imalikuks konfigureerimise objektiks peaaegu iga sĂŒsteemi jaoks (sarnane lĂ€henemine saavutatakse nĂ€iteks Django's, kus konfigureerimise objektiks on otse moodul/pakett settings).
Automaatse tĂŒpiseerimise reĆŸiimi sisselĂŒlitamine/vĂ€ljalĂŒlitamine saavutatakse kahe meetodi abil â enable_automatic_type_cast() ja disable_automatic_type_cast(). See vĂ”ib olla kasulik, kui keskkonnamuutuja sisaldabćșćititud JSON-sarnast objekti vĂ”i isegi lihtsalt booleset konstanti (Django's DEBUG muutuja selge mÀÀramine, vĂ”rreldes keskkonnamuutujat âlubatudâ stringidega â ĂŒks sagedamini esinevaid juhtumeid). Kuid nĂŒĂŒd pole enam vajadust stringe selgelt konverteerida â enamik nĂ”utavaid toiminguid on juba raamatukogu sisemuses ja ootavad lihtsalt signaali tegutsemiseks. đ Ăldiselt töötab tĂŒpiseerimine lĂ€bipaistvalt ja toetab peaaegu kĂ”iki olemasolevaid sisseehitatud andmetĂŒĂŒpe (frozenset, complex ja bytes ei ole testitud).
Python 2 toe toetamine toimus peaaegu ilma ohvriteta (looduslike elementide ja mĂ”nede viimaste Python 3 versioonide âsuhkru kommideâ mahajĂ€tmine), eelkĂ”ige tĂ€nu laialdaselt kasutatavale six (metaklasside kasutamise probleemide lahendamiseks).
Kuid piiranguid on ka veidi:
- Python 3 tugi tÀhendab versiooni 3.5 ja uuemat (nende olemasolu teie projektis on kas laiskuse vÔi vajaduse puudumise tulemus, sest on raske leida objektiivset pÔhjendust, miks te veel 3.4 peal olete);
- Python 2.7-s ei toeta teek hulga literiaalide deseraliseerimist. Kirjeldus . Kuid kui keegi soovib seda ellu viia - tere tulemast:);
Teek toetab ka erandite mehhanismi parsimise viga korral. Kui stringi ei Ă”nnestu ĂŒhtegi olemasolevat analĂŒsaatorit pidi tuvastada, jÀÀb vÀÀrtus stringiks (peamiselt mugavuse ja Bash'i muude tavade tagamiseks).
Python-shell teek
NĂŒĂŒd rÀÀgin teisest teegist (nimetamise puudused olevate analoogide suhtes jĂ€etakse kĂ”rvale - see on sarnane smart-env'i omadustega. Analooge - ja ).
Ăldiselt on rakenduse idee ja nĂ”uded sarnased smart-env'i omadustega, mida illustreerib jĂ€rgmine nĂ€ide:
from python_shell import Shell
Shell.ls('-l', '$HOME') # VÔrdub "ls -l $HOME"
command = Shell.whoami() # VÔrdub "whoami"
print(command.output) # prindib teie praeguse kasutajanime
print(command.command) # prindib "whoami"
print(command.return_code) # prindib "0"
print(command.arguments) # prindib ""
Shell.mkdir('-p', '\/tmp\/new_folder') # loob uue kausta
Idee on jÀrgmine:
- Ăksainus klass, mis kehastab Bash'i Python'i maailmas;
- Iga Bash'i kÀsk kutsutakse vÀlja klassi Shell funktsioonina;
- Iga funktsiooni kutsumise parameetrid edastatakse edasi vastava Bash'i kÀsu kutsumisse;
- Iga kĂ€sk kĂ€ivitatakse "siin ja nĂŒĂŒd" hetkel, mil seda kutsutakse, st kasutatakse sĂŒnkront lĂ€henemist;
- on vÔimalik saada juurdepÀÀs kÀsu vÀljundile stdout, samuti selle tagastamiskoodile;
- Kui kĂ€sku ei leitud sĂŒsteemist â visatakse erand.
Nagu ka smart-env'i puhul, on tagatud Python 2 tugi (kuigi ohvrit on veidi rohkem nÔutud) ja puudub tugi Python 3.0-3.4 jaoks.
Teekide arendamise plaanid
Raamatukogusid saab kasutada juba praegu: mÔlemad on avalikult saadaval PyPI-l. Algkood on saadaval Githubis (vt allpool).
MÔlemad teegid arenevad tagasisidet arvesse vÔttes, mis on saadud huvitatud osalistelt. Ja kui smart-env'i puhul vÔib uute funktsioonide mitmekesisuse vÀljamÔtlemine olla keeruline, siis python-shelli puhul on kindlasti veel mida lisada:
- mittesĂŒvaliseerivate kĂ”nede tugi;
- vÔimalus interaktiivseks suhtlemiseks meeskonnaga (töötamine stdin-iga);
- uususte lisamine (nÀiteks omadus, et saada stderr vÀljund);
- kÔigi saadavalolevate kÀskude katalooge loomine (kasutamiseks funktsiooniga dir());
- jne.
Viidatud lingid
- Teek smart-env: ja
- Teek python-shell: ja
- teekide vÀrskendused
UPD 23.02.2020:
* Reposid on ĂŒle viidud, vastavad lingid on vĂ€rskendatud
* Versioon python-shell==1.0.1 on valmimas 29.02.2020. Muudatuste seas on kÀskude automaatse tÀitmise tugi ja kÀsk dir(Shell), kÀskude kÀivitamine Python'i kehtetu identifikaatoriga, veaparandused.
Allikas: habr.com
