Ühendame Pythoni ja Bashi: raamatukogud smart-env ja python-shell

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 — smart-env ja python-shell — 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 otsing 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, lisada tüübid ja selgelt analüüsida muutujate väärtusi meetodite kutse kaudu tüübi nimega
    get_<typename>(var_name)

    Või see üks lahendus veel, mis ei toeta aga nüüd mahajäänud Python 2 (millel, vaatamata ametlikule R.I.P., 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 siin. 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 — siin ja siin).

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

  1. Ühtne klass, mis kehastab Bashi Pythoni maailmas;
  2. Iga Bash-i käsk väljendatakse Shelli klassi funktsioonina;
  3. Iga funktsiooni kutsumise parameetrid edastatakse vastava Bash-i käsu kutse käigus;
  4. Iga käsk täidetakse 'siin ja praegu' selle kõnele, st sünkrooniline lähenemine;
  5. on võimalik pääseda ligi käsu väljundile stdout-is, samuti selle tagastuskoode;
  6. 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

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

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster