Ü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