Tere pÀevast kÔigile.
Praegu on Python ĂŒks enimkasutatavaid keeli mitte ainult tarkvaratoodete loomisel, vaid ka nende infrastruktuuri tagamisel. Selle tulemusena on paljudel devopsidel, kas nende tahtel vĂ”i vastumeelselt, tulnud Ă”ppida uut keelt, et kasutada seda tĂ€iendava vahendina vanade heade Bash-skriptide kĂ”rvale. Siiski jĂ€rgivad Bash ja Python erinevaid lĂ€henemisviise koodi kirjutamisele ja neil on omad eripĂ€rad, mistĂ”ttu Bash-skriptide ĂŒleviimine 'sibi keelde' osutub mĂ”nikord keeruliseks ja kaugel lihtsast ĂŒlesandest.
Devopside elu lihtsustamiseks on loodud ja loomisel on palju kasulikke raamatukogude ja utiliite Pythonis. KĂ€esolev artikkel tutvustab kahte uut raamatukogu, mille autor on selle postituse autor â ja â ja mille eesmĂ€rk on vabastada devops vajadusest pöörata liiga palju tĂ€helepanu Pythoniga töötamise nĂŒanssidele, jĂ€ttes ruumi huvitavamatele ĂŒlesannetele. Raamatukogude tegevusala on keskkonnamuutujad ja vĂ€liste utiliitide kĂ€ivitamine.
Kellele see huvi pakub, palun allpool.
Uued âjalgrattadâ?
KĂŒsimus on, miks luua uusi pakette piisavalt igapĂ€evaste toimingute jaoks? Mis takistab otse os.environ ja subprocess-i kasutamist.<valige oma meetod vĂ”i klass>?
Toon iga raamistikuga seonduvad tÔendid eraldi.
Raamatukogu smart-env
Enne oma lahenduse kirjutamist on kasulik uurida Internetti ja otsida valmis lahendusi. Loomulikult on risk, et ei leia vajalikku, kuid see on pigem âkindlustusjuhtumâ. Reeglina töötab lĂ€henemine ja sÀÀstab palju aega ja vaeva.
Tulemuste pÔhjal tuvastati jÀrgmine:
- on pakette, mis tĂ”eliselt ĂŒmbritsevad os.environi kutsungite tegemist, nĂ”udes samas palju segavaid tegevusi (klassiekspertide loomine, erilised parameetrid kutsetes jne);
- on hĂ€id pakette, kuid need on tugevalt seotud teatud ökosĂŒsteemiga (peamiselt veebiraamistikud nagu Django) ja seetĂ”ttu mitte universaalsed ilma tinutamiseta;
- on haruldased katsetused millegi uue tegemiseks. NĂ€iteks, ja selgelt analĂŒĂŒsida muutujate vÀÀrtusi meetodite kutse kaudu tĂŒĂŒbi nimega
get_<typename>(var_name)VĂ”i see , mis ei toeta aga nĂŒĂŒd mahajÀÀnud Python 2 (millel, vaatamata , on siiani kĂŒlluses kirjutatud koodi ja terveid ökosĂŒsteeme);
- on olemas kooli-ĂŒliĂ”pilaste teosed, millel on ĂŒldse arusaamatu pĂ”hjus, miks nad on sattunud upstream'i PyPI ja loovad vaid uusi pakettide nimede probleeme (konkreetsemalt, nimi «smart-env» â sunnitud lahendus).
Ja seda nimekirja vĂ”iks jĂ€tkata pikalt. Siiski, juba eeltoodud punktidest piisas, et sĂŒttida idee peale luua midagi mugavat ja universaalset.
NÔuded, mis olid esitatud smart-env kirjutamise eelselt:
- Maksimaalselt lihtne kasutusmudel
- Lihtsalt konfigureeritav andmetĂŒĂŒpide tugi
- Ăhilduvus Python 2.7-ga
- Hea koodikatte katsetes
LÔppkokkuvÔttes Ônnestus seda kÔike ellu viia. Siin on nÀide kasutamisest:
from smart_env import ENV
print(ENV.HOME) # Vibutab print(os.environ['HOME'])
# eeldades, et seadista keskkonnamuutuja MYVAR vÀÀrtuseks "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Vibutab boolean True
ENV.NEW_VAR = 100 # Seab uue keskkonnamuutuja
Nagu nĂ€ha on, piisab uue klassi kasutamiseks selle importimisest (eksemplari loomine ei ole vajalik â see vĂ€listab liigse tegevuse). ĂkskĂ”ik millisele keskkonnamuutujale juurdepÀÀs toimub klassi ENV muutujana, mis tegelikult muudab selle klassi loogiliseks mĂ€hiseks natiivse sĂŒsteemi keskkonnale, samal ajal muutes selle praktiliselt igas sĂŒsteemis konfiguratsiooni objekti vĂ”imaluseks (sarnast lĂ€henemist rakendatakse nĂ€iteks Django-s, kus konfiguratsiooni objektina toimib otse moodul/pakett settings).
Automaatse tĂŒĂŒbi mÀÀramise toe lubamine/keelamine toimub kahe meetodi abil â enable_automatic_type_cast() ja disable_automatic_type_cast(). See vĂ”ib olla mugav, kui keskkonnamuutujas on seriaalne JSON-sarnane objekt vĂ”i isegi lihtsalt boolen konstant (mida sageli esindab Django DEBUG muutuja, vĂ”rreldes keskkonnamuutujat "lubatud" stringidega). Kuid nĂŒĂŒd ei ole vaja stringe selgelt konverteerida â enamik vajalikke toiminguid on juba raamatukogu sĂŒgavamatesse kihtidesse kodeeritud ja ootab ainult tegevusmĂ€rguannet. đ Ăldiselt toimib tĂŒpiseerimine lĂ€bipaistvalt ja toetab peaaegu kĂ”iki olemasolevaid sisseehitatud andmetĂŒĂŒpe (frozenset, complex ja bytes ei ole testitud).
Python 2 toe nĂ”ue on ellu viidud peaaegu ilma ohvriteta (loobumine typingust ja mĂ”nest viimaste Python 3 versioonide "kommimisest"), eelkĂ”ige tĂ€nu ĂŒhemĂ”ttelisele six-ile (et lahendada metaklasside kasutamise probleeme).
Kuid on ka mÔned piirangud:
- Python 3 tugi eeldab versiooni 3.5 vÔi uuemat (nende olemasolu teie projektis on kas pettuse vÔi arenduste puudumise tulemus, kuna on keeruline vÀlja mÔelda objektiivset pÔhjust, miks te endiselt versioonil 3.4 olete);
- Python 2.7 puhul ei toeta teek hulgi-elementide deserialiseerimist. Kirjeldus . Kuid kui keegi soovib selle teostada â tere tulemast;)
Teek sisaldab ka erandite mehhanismi parsimise vigade korral. Kui kedagi analĂŒsaatorit ei Ă”nnestu tuvastada, jÀÀb vÀÀrtus stringiks (peamiselt mugavuse ja tagasipöörduva ĂŒhilduvuse tĂ”ttu Bashis).
Teek python-shell
NĂŒĂŒd rÀÀgin teisest teegist (sarnaste analoogide puudujÀÀkide kirjeldust ma ei kĂ€sitle â see sarnaneb smart-env jaoks kirjeldatule. Analoogid â ja ).
Ăldiselt on teostuse idee ja nĂ”uded sarnased smart-env jaoks kirjeldatule, mida tĂ”estab jĂ€rgmine nĂ€ide:
from python_shell import Shell
Shell.ls('-l', '$HOME') # VÔrdne "ls -l $HOME"
command = Shell.whoami() # VÔrdne "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:
- Ăhtne klass, mis kehastab Bashi Pythoni maailmas;
- Iga Bash-i kÀsk vÀljendatakse Shelli klassi funktsioonina;
- Iga funktsiooni kutsumise parameetrid edastatakse vastava Bash-i kÀsu kutse kÀigus;
- Iga kĂ€sk tĂ€idetakse 'siin ja praegu' selle kĂ”nele, st sĂŒnkrooniline lĂ€henemine;
- on vÔimalik pÀÀseda ligi kÀsu vÀljundile stdout-is, samuti selle tagastuskoode;
- Kui kĂ€sku sĂŒsteemis pole, visatakse vĂ€lja erand.
Nagu ka smart-env puhul, on tagatud Python 2 toetus (kuigi veidi rohkem ohvriverd on vaja) ja Python 3.0-3.4 toetust ei ole.
Raamatukogude arendusplaanid
Raamatukogusid saab juba praegu kasutada: mÔlemad on avaldatud ametlikus PyPIs. Algallikad on saadaval Githubis (vt allpool).
MÔlemat raamatukogu arendatakse vastavalt tagasisidele, mis on saadud huvilistelt. Ja kui smart-env puhul vÔib olla keeruline uute funktsioonide mitmekesisust vÀlja mÔelda, siis python-shellis on kindlasti veel midagi lisada:
- toetamine mitteblokeerivatele kutsestandarditele;
- vÔimalus interaktiivseks suhtlemiseks kÀsuga (töötamine stdiniga);
- uute omaduste lisamine (nÀiteks omadus stderr-ist vÀljavÔtte saamiseks);
- kaustade nimekiri, mis on saadaval kÀskude jaoks (kasutamiseks funktsiooniga dir());
- Kui kaua aega kulub vÀljastamiseks?
Lingid
- smart-env teek: ja
- python-shell teek: ja
- teekide uuendused
UPD 23.02.2020:
* Reposiitiorid on ĂŒmber kolitud, vastavad lingid on uuendatud
* python-shell==1.0.1 versioon on saavutamas vÀljalaskmist 29.02.2020. Muudatuste hulka kuulub kÀskude autokomplekti toetamine ja dir(Shell) kÀsu kÀitamine, Pythonis kehtetu identifikaatoriga kÀskude tÀitmine, vigade parandamine.
Allikas: habr.com
