Pythoni ja Bashi sõpruse loomine: smart-env- ja python-shelliteegid

Tere päevast kõigile.

Tänapäeval on Python üks enimkasutatavaid keeli mitte ainult tarkvaratoodete endi loomisel, vaid ka nende infrastruktuuri pakkumisel. Selle tulemusena pidid paljud devopid, kas oma tahtel või vastu, õppima uue keele, et seda hiljem vanade heade bashi skriptide täiendusena kasutada. Bash ja Python tunnistavad aga koodi kirjutamisel erinevaid lähenemisviise ja neil on teatud funktsioonid, mis tähendab, et Bashi skriptide teisaldamine "ussikeelde" osutub mõnikord mahukaks ja kaugeltki mitte triviaalseks ülesandeks.

Devoppide elu hõlbustamiseks on Pythonis loodud ja luuakse jätkuvalt palju kasulikke teeke ja utiliite. See artikkel kirjeldab kahte uut teeki, mille selle postituse autor on loonud - smart-env и python-shell - ja mõeldud selleks, et vabastada devops vajadusest pöörata suurt tähelepanu Pythoniga töötamise keerukusele, jättes ruumi huvitavamatele ülesannetele. Raamatukogude tegevusalaks on keskkonnamuutujad ja väliste utiliitide käivitamine.

Kellel huvi, vaadake kassi.

Uued "jalgrattad"?

Näib, miks luua uusi pakette üsna tavaliste toimingute jaoks? Mis takistab teil os.environi ja subprocess.<method or class of your choice> otse kasutamist?

Esitan tõendid iga raamatukogu kasuks eraldi.

smart-env raamatukogu

Enne oma vaimusünnituse kirjutamist on kasulik minna veebi ja otsida valmis lahendusi. Muidugi on oht, et te ei leia seda, mida vajate, kuid see on pigem "kindlustusjuhtum". Reeglina see lähenemine toimib ja säästab palju aega ja vaeva.

Vastavalt tulemustele otsing selgus järgmine:

  • on pakette, mis tegelikult murravad kõned aadressile os.environ, kuid nõuavad samal ajal hunnikut segavaid toiminguid (klassi eksemplari loomine, eriparameetrid kõnedes jne);
  • On häid pakette, mis aga on rangelt seotud konkreetse ökosüsteemiga (peamiselt veebiraamistikud nagu Django) ja pole seetõttu ilma failita sugugi universaalsed;
  • harva on katseid midagi uut teha. Näiteks, lisa trükkimine ja selgesõnaliselt sõeluvad muutujate väärtusi, kutsudes selliseid meetodeid nagu
    get_<typename>(var_name)

    Või siin veel üks lahendus, mis aga ei toeta nüüdseks häbiväärset Python 2 (mis hoolimata ametlik RIP, on veel mägesid kirjutatud koodi ja terveid ökosüsteeme);

  • On kooliõpilaste käsitööd, mis mingil teadmata põhjusel sattusid ülesvoolu PyPI-sse ja tekitavad probleeme ainult uute pakettide nimetamisega (eelkõige on nimi "smart-env" vajalik meede).

Ja seda loetelu võib jätkata veel kaua. Kuid ülaltoodud punktidest piisas, et tekitada mulle põnevust idee teha midagi mugavat ja universaalset.

Enne smart-env kirjutamist seatud nõuded:

  • Kõige lihtsam kasutusskeem
  • Lihtsalt konfigureeritav andmete sisestamise tugi
  • Python 2.7 ühilduv
  • Hea koodi katvus testidega

Lõpuks saadi sellest kõigest aru. Siin on näide kasutamisest:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

Nagu näitest näete, peate uue klassiga töötamiseks selle lihtsalt importima (te ei pea eksemplari looma – miinus lisatoimingud). Juurdepääs mis tahes keskkonnamuutujale saavutatakse, viidates sellele kui ENV-klassi muutujale, mis tegelikult muudab selle klassi loomuliku süsteemikeskkonna jaoks intuitiivseks ümbriseks, muutes selle samal ajal võimalikuks konfiguratsiooniobjektiks peaaegu iga süsteemi jaoks ( sarnane lähenemine saavutatakse näiteks Djangos , ainult seal on konfiguratsiooniobjektiks seadistuste moodul/pakett ise).

Automaatse tippimise tugirežiimi lubamine/keelamine saavutatakse kahe meetodi abil - enable_automatic_type_cast() ja disable_automatic_type_cast(). See võib olla mugav, kui keskkonnamuutuja sisaldab serialiseeritud JSON-i sarnast objekti või isegi ainult Boole'i ​​konstanti (üks levinumaid juhtumeid on Djangos SILUTUMUTUJA selgesõnaline seadistamine, võrreldes keskkonnamuutujat kehtivate stringidega). Kuid nüüd pole vaja stringe selgesõnaliselt teisendada - enamik vajalikke toiminguid on juba raamatukogu sügavustesse sisse ehitatud ja ootavad vaid signaali tegutsemiseks. 🙂 Üldiselt töötab tippimine läbipaistvalt ja toetab peaaegu kõiki saadaolevaid sisseehitatud andmetüüpe (külmutatud, kompleksi ja baite ei testitud).

Python 2 toetamise nõue rakendati praktiliselt ilma ohverdusteta (Python 3 uusimate versioonide tippimisest ja mõnest "suhkruskommidest" loobumine), eelkõige tänu üldlevinud kuuele (lahendada metaklasside kasutamise probleeme ).

Kuid on mõned piirangud:

  • Python 3 tugi tähendab versiooni 3.5 ja uuemat (nende olemasolu teie projektis on kas laiskuse või täiustusvajaduse puudumise tagajärg, kuna on raske välja tuua objektiivset põhjust, miks olete endiselt versioonil 3.4);
  • Python 2.7 puhul ei toeta teek seatud literaalide deserialiseerimist. Kirjeldus siin. Aga kui keegi soovib seda ellu viia, siis olete oodatud :);

Teegil on ka erandmehhanism parsimisvigade puhuks. Kui ükski saadaolevatest analüsaatoritest ei suuda stringi ära tunda, jääb väärtus stringiks (pigem mugavuse ja tagasiühilduvuse huvides Bashi muutujate töötamise tavapärase loogikaga).

python-shelli raamatukogu

Nüüd räägin teile teisest raamatukogust (jätan välja olemasolevate analoogide puuduste kirjelduse - see on sarnane smart-env. Analoogide puhul kirjeldatuga - siin и siin).

Üldiselt on juurutamise idee ja sellele esitatavad nõuded sarnased smart-env-i puhul kirjeldatutega, nagu on näha näitest:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

Idee on järgmine:

  1. Üks klass, mis esindab Pythoni maailmas Bashi;
  2. Iga Bashi käsku kutsutakse välja Shell-klassi funktsioonina;
  3. Seejärel edastatakse iga funktsioonikutse parameetrid vastavasse Bashi käsukutsesse;
  4. Iga käsk täidetakse “siin ja praegu” hetkel, mil see välja kutsutakse, st. sünkroonne lähenemine töötab;
  5. stdout-is on võimalik juurde pääseda käsu väljundile ja ka selle tagastuskoodile;
  6. Kui käsku süsteemis pole, tehakse erand.

Nagu smart-env puhul, on Python 2 tugi olemas (kuigi vaja oli veidi rohkem ohverdavat verd) ja Python 3.0-3.4 tugi puudub.

Raamatukogu arengukavad

Saate teeke nüüd kasutada: mõlemad on postitatud ametlikule PyPI-le. Allikad on saadaval Githubis (vt allpool).

Mõlemat raamatukogu arendatakse huvilistelt kogutud tagasisidet arvestades. Ja kui smart-env-is võib olla keeruline välja pakkuda mitmesuguseid uusi funktsioone, siis python-shellis on kindlasti veel midagi lisada:

  • mitteblokeerivate kõnede tugi;
  • interaktiivse suhtluse võimalus meeskonnaga (stdiniga töötamine);
  • uute omaduste lisamine (näiteks atribuut stderri väljundi vastuvõtmiseks);
  • saadaolevate käskude kataloogi rakendamine (kasutamiseks koos funktsiooniga dir());
  • jne

Viited

  1. smart-env raamatukogu: Github и PyPI
  2. python-shelli teek: Github и PyPI
  3. Telegrami kanal raamatukogu uuendused

UPD 23.02.2020:
* Repositooriumid on teisaldatud, vastavaid linke uuendatud
* Versiooni python-shell==1.0.1 valmistatakse ette avaldamiseks 29.02.2020. Muudatused hõlmavad käskude automaatse täitmise ja dir(Shell) käsu tuge, kehtetu Pythoni identifikaatoriga käskude käitamist ja veaparandusi.

Allikas: www.habr.com

Lisa kommentaar