Python un Bash draudzÄ«bas veidoÅ”ana: smart-env un python-shell bibliotēkas

Laba diena visiem.

MÅ«sdienās Python ir viena no visvairāk izmantotajām valodām ne tikai paÅ”u programmatÅ«ras produktu radÄ«Å”anā, bet arÄ« to infrastruktÅ«ras nodroÅ”ināŔanā. Rezultātā daudziem devopiem pēc savas gribas vai pret to bija jāiemācās jauna valoda, lai vēlāk to izmantotu kā papildinājumu vecajiem labajiem BaÅ”a skriptiem. Tomēr Bash un Python izmanto dažādas pieejas koda rakstÄ«Å”anai, un tiem ir noteiktas funkcijas, kas nozÄ«mē, ka Bash skriptu pārneÅ”ana uz ā€œÄÅ«skas valoduā€ dažkārt izrādās ietilpÄ«gs un nebÅ«t ne triviāls uzdevums.

Lai atvieglotu devops dzÄ«vi, Python ir izveidotas un tiek veidotas daudzas noderÄ«gas bibliotēkas un utilÄ«tas. Å ajā rakstā ir aprakstÄ«tas divas jaunas bibliotēkas, ko izveidojis Ŕīs ziņas autors - smart-env Šø python-čaula - un paredzēts, lai atbrÄ«votu devops no nepiecieÅ”amÄ«bas pievērst lielu uzmanÄ«bu darba ar Python sarežģītÄ«bām, atstājot vietu interesantākiem uzdevumiem. Bibliotēku darbÄ«bas joma ir vides mainÄ«gie un ārējo utilÄ«tu palaiÅ”ana.

Ikviens interesents, lūdzu, skatiet kaķi.

Jauni "velosipēdi"?

Å Ä·iet, kāpēc izveidot jaunas paketes diezgan parastām darbÄ«bām? Kas jums traucē tieÅ”i izmantot os.environ un subprocess.<method or class of your choice>?

Es sniegÅ”u pierādÄ«jumus par labu katrai no bibliotēkām atseviŔķi.

smart-env bibliotēka

Pirms rakstÄ«t savu ideju, ir lietderÄ«gi ieiet tieÅ”saistē un meklēt gatavus risinājumus. Protams, pastāv risks neatrast vajadzÄ«go, taču tas drÄ«zāk ir ā€œapdroÅ”ināŔanas gadÄ«jumsā€. Parasti Ŕī pieeja darbojas un ietaupa daudz laika un pūļu.

Saskaņā ar rezultātiem meklÄ“Å”ana atklājās sekojoÅ”ais:

  • ir pakotnes, kas faktiski aplauza izsaukumus uz os.environ, bet tajā paŔā laikā prasa virkni traucējoÅ”u darbÄ«bu (klases instances izveide, Ä«paÅ”i parametri izsaukumos utt.);
  • Ir labas pakotnes, kuras tomēr ir stingri piesaistÄ«tas konkrētai ekosistēmai (galvenokārt tÄ«mekļa ietvariem, piemēram, Django), un tāpēc bez faila nepavisam nav universālas;
  • ir reti mēģinājumi izdarÄ«t ko jaunu. Piemēram, pievienot rakstÄ«Å”anu un skaidri parsēt mainÄ«gās vērtÄ«bas, izsaucot tādas metodes kā
    get_<typename>(var_name)

    Vai Å”eit vēl viens risinājums, kas tomēr neatbalsta tagad apkaunoto Python 2 (kas, neskatoties uz to oficiālais RIP, joprojām ir rakstÄ«ta koda kalni un veselas ekosistēmas);

  • Ir skolnieku amatniecÄ«ba, kas nezināma iemesla dēļ nokļuva augÅ”upējā PyPI un rada problēmas tikai ar jaunu pakotņu nosaukumu pieŔķirÅ”anu (jo Ä«paÅ”i nosaukums ā€œsmart-envā€ ir nepiecieÅ”ams pasākums).

Un Å”o sarakstu var turpināt vēl ilgi. Tomēr ar iepriekÅ”minētajiem punktiem pietika, lai mani sajÅ«sminātu ideja izveidot kaut ko ērtu un universālu.

Prasības, kas tika noteiktas pirms smart-env rakstīŔanas:

  • VienkārŔākā lietoÅ”anas shēma
  • Viegli konfigurējams datu ievadÄ«Å”anas atbalsts
  • SaderÄ«gs ar Python 2.7
  • Labs koda pārklājums ar testiem

Galu galā tas viss tika realizēts. Å eit ir lietoÅ”anas piemērs:

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

Kā redzams no piemēra, lai strādātu ar jaunu klasi, tā vienkārÅ”i ir jāimportē (jums nav jāizveido instance ā€” atskaitot papildu darbÄ«bu). Piekļuve jebkuram vides mainÄ«gajam tiek panākta, atsaucoties uz to kā uz ENV klases mainÄ«go, kas faktiski padara Å”o klasi par intuitÄ«vu sākotnējās sistēmas vides iesaiņojumu, vienlaikus pārvērÅ”ot to par iespējamu konfigurācijas objektu gandrÄ«z jebkurai sistēmai ( lÄ«dzÄ«ga pieeja, piemēram, tiek panākta Django , tikai tur konfigurācijas objekts ir pats iestatÄ«jumu modulis/pakete).

Automātiskās rakstÄ«Å”anas atbalsta režīma iespējoÅ”ana/atspējoÅ”ana tiek panākta, izmantojot divas metodes - enable_automatic_type_cast() un disable_automatic_type_cast(). Tas var bÅ«t ērti, ja vides mainÄ«gais satur serializētu JSON lÄ«dzÄ«gu objektu vai pat tikai BÅ«la konstanti (viens no visizplatÄ«tākajiem gadÄ«jumiem ir Django mainÄ«gā DEBUG iestatÄ«Å”ana, salÄ«dzinot vides mainÄ«go ar ā€œderÄ«gāmā€ virknēm). Taču tagad nav vajadzÄ«bas nepārprotami konvertēt virknes - lielākā daļa nepiecieÅ”amo darbÄ«bu jau ir iestrādātas bibliotēkas dziļumos un tikai gaida signālu rÄ«koties. šŸ™‚ Kopumā rakstÄ«Å”ana darbojas caurspÄ«dÄ«gi un atbalsta gandrÄ«z visus pieejamos iebÅ«vētos datu tipus (netika pārbaudÄ«ti iesaldētie, kompleksie un baiti).

PrasÄ«ba atbalstÄ«t Python 2 tika Ä«stenota praktiski bez upuriem (atteikÅ”anās no maŔīnrakstÄ«Å”anas un dažām Python 3 jaunāko versiju ā€œcukurkonfektēmā€), jo Ä«paÅ”i pateicoties visuresoÅ”ajam seÅ”iniekam (lai atrisinātu metaklases lietoÅ”anas problēmas ).

Bet ir daži ierobežojumi:

  • Python 3 atbalsts nozÄ«mē versiju 3.5 un jaunāku versiju (to klātbÅ«tne jÅ«su projektā ir slinkuma vai uzlabojumu trÅ«kuma rezultāts, jo ir grÅ«ti izdomāt objektÄ«vu iemeslu, kāpēc jÅ«s joprojām izmantojat 3.4);
  • Python versijā 2.7 bibliotēka neatbalsta iestatÄ«to literāļu deserializāciju. Apraksts Å”eit. Bet, ja kāds vēlas to Ä«stenot, laipni lÅ«gts :);

Bibliotēkai ir arÄ« izņēmuma mehānisms parsÄ“Å”anas kļūdu gadÄ«jumā. Ja virkni nevar atpazÄ«t neviens no pieejamajiem analizatoriem, vērtÄ«ba paliek virkne (drÄ«zāk ērtÄ«bas un atpakaļsaderÄ«bas ar parasto mainÄ«go darbÄ«bas loÄ£iku Bash dēļ).

python-shell bibliotēka

Tagad es jums pastāstÄ«Å”u par otro bibliotēku (es izlaidÄ«Å”u esoÅ”o analogu trÅ«kumu aprakstu - tā ir lÄ«dzÄ«ga tai, kas aprakstÄ«ta smart-env. Analogiem - Å”eit Šø Å”eit).

Kopumā ievieÅ”anas ideja un prasÄ«bas tai ir lÄ«dzÄ«gas tām, kas aprakstÄ«tas smart-env, kā redzams no piemēra:

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

Ideja ir Ŕāda:

  1. Viena klase, kas pārstāv BaÅ”u Python pasaulē;
  2. Katra Bash komanda tiek izsaukta kā Shell klases funkcija;
  3. Pēc tam katra funkcijas izsaukuma parametri tiek nodoti atbilstoÅ”ajam Bash komandas izsaukumam;
  4. Katra komanda tiek izpildÄ«ta ā€œÅ”eit un tagadā€ tās izsaukÅ”anas brÄ«dÄ«, t.i. darbojas sinhronā pieeja;
  5. stdout ir iespējams piekļūt komandas izvadei, kā arÄ« tās atgrieÅ”anas kodam;
  6. Ja komandas nav sistēmā, tiek izmests izņēmums.

Tāpat kā smart-env, ir atbalsts Python 2 (lai gan bija nepiecieÅ”ams nedaudz vairāk upurētu asiņu), un Python 3.0ā€“3.4 netiek atbalstÄ«ts.

Bibliotēkas attīstības plāni

Bibliotēkas varat izmantot tagad: abas ir publicētas oficiālajā PyPI. Avoti ir pieejami vietnē Github (skatīt zemāk).

Abas bibliotēkas tiks attīstītas, ņemot vērā interesentu apkopotās atsauksmes. Un, ja smart-env var būt grūti piedāvāt dažādas jaunas funkcijas, tad python-shell noteikti ir jāpievieno vēl kaut kas:

  • atbalsts nebloķējoÅ”iem zvaniem;
  • interaktÄ«vās komunikācijas iespēja ar komandu (darbs ar stdin);
  • jaunu rekvizÄ«tu pievienoÅ”ana (piemēram, rekvizÄ«ts, lai saņemtu izvadi no stderr);
  • pieejamo komandu direktorija ievieÅ”ana (izmantoÅ”anai ar funkciju dir());
  • uc

atsauces

  1. smart-env bibliotēka: GitHub Šø PyPI
  2. python-shell bibliotēka: GitHub Šø PyPI
  3. Telegrammas kanāls bibliotēkas atjauninājumi

UPD 23.02.2020:
* Krātuves ir pārvietotas, atbilstoŔās saites ir atjauninātas
* Versija python-shell==1.0.1 tiek sagatavota izlaiÅ”anai 29.02.2020. Izmaiņas ietver komandu automātiskās pabeigÅ”anas un dir(Shell) komandas atbalstu, komandu izpildi ar nederÄ«gu Python identifikatoru un kļūdu labojumus.

Avots: www.habr.com

Pievieno komentāru