Toome kokku Python'i ja Bash'i: teegid smart-env ja python-shell

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 — smart-env ja python-shell — 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 otsing 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, lisada tĂŒĂŒbihindamine ja analĂŒĂŒsida muutujaid selgelt, kutsudes esile meetodeid tĂŒĂŒpi
    get_(var_name)

    VĂ”i veel ĂŒks lahendus , mis siiski ei toeta praegu tagakiusatavat Python 2 (millel, vaatamata sellele,, mis siiski ei toeta enam kasutuses olevat Python 2 (millel, vaatamata sellele, ametlik R.I.P., 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 siit. 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 - siit ja siit).

Ü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:

  1. Üksainus klass, mis kehastab Bash'i Python'i maailmas;
  2. Iga Bash'i kÀsk kutsutakse vÀlja klassi Shell funktsioonina;
  3. Iga funktsiooni kutsumise parameetrid edastatakse edasi vastava Bash'i kÀsu kutsumisse;
  4. Iga kĂ€sk kĂ€ivitatakse "siin ja nĂŒĂŒd" hetkel, mil seda kutsutakse, st kasutatakse sĂŒnkront lĂ€henemist;
  5. on vÔimalik saada juurdepÀÀs kÀsu vÀljundile stdout, samuti selle tagastamiskoodile;
  6. 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

  1. Teek smart-env: Github ja PyPI
  2. Teek python-shell: Github ja PyPI
  3. Telegrami kanal 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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster