Python- ja Bash-ystävyyden tekeminen: smart-env- ja python-shell-kirjastot

Hyvää päivää kaikille.

Python on nykyään yksi käytetyimmistä kielistä paitsi itse ohjelmistotuotteiden luomisessa, myös niiden infrastruktuurin tarjoamisessa. Seurauksena oli, että monet devopit omasta tahdostaan ​​tai vastoin sitä joutuivat opettelemaan uuden kielen myöhempää käyttöä varten vanhojen hyvien Bash-skriptien täydennykseksi. Kuitenkin Bash ja Python tunnustavat erilaisia ​​lähestymistapoja koodin kirjoittamiseen ja niillä on tiettyjä ominaisuuksia, mikä tarkoittaa, että Bash-skriptien siirtäminen "käärmekielelle" osoittautuu joskus tilavaksi ja kaukana triviaalista tehtävästä.

Devoppien elämän helpottamiseksi Pythonissa on luotu monia hyödyllisiä kirjastoja ja apuohjelmia, joita luodaan edelleen. Tässä artikkelissa kuvataan kaksi uutta kirjastoa, jotka tämän viestin kirjoittaja on luonut - smart-env и python-kuori - ja suunniteltu vapauttamaan devops tarpeesta kiinnittää paljon huomiota Python-työskentelyn monimutkaisuuteen, jättäen tilaa mielenkiintoisemmille tehtäville. Kirjastojen toimialana on ympäristömuuttujat ja ulkoisten apuohjelmien käynnistäminen.

Kaikki kiinnostuneet, katso kissa.

Uusia "polkupyöriä"?

Vaikuttaa siltä, ​​miksi luoda uusia paketteja melko tavallisiin toimintoihin? Mikä estää sinua käyttämästä os.environ- ja subprocess.<method or class> suoraan?

Esitän todisteet kunkin kirjaston puolesta erikseen.

smart-env-kirjasto

Ennen oman aivolapsen kirjoittamista on hyödyllistä käydä verkossa ja etsiä valmiita ratkaisuja. Tietenkin on olemassa riski, että et löydä tarvitsemaasi, mutta tämä on pikemminkin "vakuutustapahtuma". Yleensä tämä lähestymistapa toimii ja säästää paljon aikaa ja vaivaa.

Tulosten perusteella tutkiva paljastettiin seuraavaa:

  • on paketteja, jotka itse asiassa käärivät kutsut os.environille, mutta vaativat samalla joukon häiritseviä toimia (luokan esiintymän luominen, kutsujen erikoisparametrit jne.);
  • On olemassa hyviä paketteja, jotka on kuitenkin tiukasti sidottu tiettyyn ekosysteemiin (pääasiassa verkkokehykset, kuten Django), eivätkä siksi ole ollenkaan yleismaailmallisia ilman tiedostoa;
  • harvoin yritetään tehdä jotain uutta. Esimerkiksi, lisää kirjoitus ja jäsentää eksplisiittisesti muuttujien arvoja kutsumalla menetelmiä, kuten
    get_<typename>(var_name)

    Tai tässä vielä yksi ratkaisu, joka ei kuitenkaan tue nyt häpeällistä Python 2:ta (josta huolimatta virallinen RIP, on edelleen vuoria kirjoitettua koodia ja kokonaisia ​​ekosysteemejä);

  • On koululaisten käsitöitä, jotka jostain tuntemattomasta syystä päätyivät ylävirran PyPI:hen ja aiheuttavat ongelmia vain uusien pakettien nimeämisessä (erityisesti nimi "smart-env" on välttämätön toimenpide).

Ja tätä listaa voi jatkaa vaikka kuinka pitkään. Yllä olevat kohdat kuitenkin riittivät innostumaan ajatuksesta tehdä jotain kätevää ja universaalia.

Vaatimukset, jotka asetettiin ennen smart-env:n kirjoittamista:

  • Yksinkertaisin käyttösuunnitelma
  • Helposti konfiguroitava tietojen kirjoittamisen tuki
  • Python 2.7 yhteensopiva
  • Hyvä koodipeitto testeissä

Lopulta tämä kaikki tajuttiin. Tässä esimerkki käytöstä:

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

Kuten esimerkistä näet, uuden luokan kanssa työskentelyyn sinun tarvitsee vain tuoda se (sinun ei tarvitse luoda ilmentymää - vähennettynä ylimääräisillä toimilla). Pääsy mihin tahansa ympäristömuuttujaan saavutetaan viittaamalla siihen ENV-luokan muuttujana, mikä itse asiassa tekee tästä luokasta intuitiivisen kääreen alkuperäiselle järjestelmäympäristölle, samalla kun se muuttaa sen mahdolliseksi konfigurointiobjektiksi melkein mille tahansa järjestelmälle ( samanlainen lähestymistapa saavutetaan esimerkiksi Djangossa, vain siellä konfigurointiobjekti on itse asetusmoduuli/paketti).

Automaattisen kirjoitustukitilan käyttöönotto/poistaminen käytöstä saadaan kahdella menetelmällä - enable_automatic_type_cast() ja disable_automatic_type_cast(). Tämä voi olla kätevää, jos ympäristömuuttuja sisältää serialisoidun JSON-tyyppisen objektin tai jopa vain Boolen vakion (yks yleisimmistä tapauksista on DEBUG-muuttujan asettaminen nimenomaisesti Djangossa vertaamalla ympäristömuuttujaa "kelvollisiin" merkkijonoihin). Mutta nyt merkkijonoja ei tarvitse erikseen muuntaa - suurin osa tarvittavista toimista on jo upotettu kirjaston syvyyksiin ja vain odottavat signaalia toimia. 🙂 Yleensä kirjoittaminen toimii läpinäkyvästi ja tukee lähes kaikkia saatavilla olevia sisäänrakennettuja tietotyyppejä (jäädytettyä, kompleksista ja tavua ei testattu).

Python 2:n tukivaatimus toteutettiin käytännössä ilman uhrauksia (python 3:n uusimpien versioiden kirjoittamisesta ja joistakin "sokereista" luopuminen), erityisesti kaikkialla läsnä olevan kuuden (metaluokkien käytön ongelmien ratkaisemiseksi) ansiosta.

Mutta on joitain rajoituksia:

  • Python 3 -tuki tarkoittaa versiota 3.5 ja uudempia (niiden läsnäolo projektissasi johtuu joko laiskuudesta tai parannustarpeen puutteesta, koska on vaikea keksiä objektiivista syytä, miksi olet edelleen 3.4:ssä);
  • Python 2.7:ssä kirjasto ei tue asetettujen literaalien deserialisointia. Kuvaus täällä. Mutta jos joku haluaa toteuttaa sen, niin tervetuloa :);

Kirjastossa on myös poikkeusmekanismi jäsennysvirheiden varalta. Jos mikään käytettävissä olevista analysaattoreista ei tunnista merkkijonoa, arvo pysyy merkkijonona (pikemminkin mukavuussyistä ja taaksepäin yhteensopivuuden vuoksi Bashin muuttujien tavanomaisen toimintalogiikan kanssa).

python-shell -kirjasto

Nyt kerron teille toisesta kirjastosta (jätän pois kuvauksen olemassa olevien analogien puutteista - se on samanlainen kuin smart-env. Analogues -sovelluksessa kuvattu - täällä и täällä).

Yleisesti ottaen toteutusidea ja sen vaatimukset ovat samanlaisia ​​kuin smart-env:lle kuvatut, kuten esimerkistä voidaan nähdä:

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

Idea on tämä:

  1. Yksi luokka, joka edustaa Bashia Python-maailmassa;
  2. Jokaista Bash-komentoa kutsutaan Shell-luokan funktiona;
  3. Kunkin funktiokutsun parametrit välitetään sitten vastaavaan Bash-komentokutsuun;
  4. Jokainen komento suoritetaan "tässä ja nyt" sillä hetkellä, kun sitä kutsutaan, ts. synkroninen lähestymistapa toimii;
  5. on mahdollista päästä käsiksi stdout-komennon ulostuloon sekä sen palautuskoodiin;
  6. Jos komento ei ole järjestelmässä, tehdään poikkeus.

Kuten smart-env:ssä, Python 2:lle on tuki (vaikka vaadittiin vähän enemmän uhrautuvaa verta) eikä Python 3.0-3.4 -tukea.

Kirjaston kehittämissuunnitelmat

Voit käyttää kirjastoja nyt: molemmat on julkaistu virallisessa PyPI:ssä. Lähteet ovat saatavilla Githubista (katso alla).

Molempia kirjastoja kehitetään kiinnostuneilta kerätyn palautteen perusteella. Ja jos useiden uusien ominaisuuksien keksiminen smart-envissä voi olla vaikeaa, python-shelliin on ehdottomasti lisättävä jotain:

  • tuki ei-estäville puheluille;
  • mahdollisuus interaktiiviseen kommunikointiin tiimin kanssa (työskentely stdinin kanssa);
  • uusien ominaisuuksien lisääminen (esimerkiksi ominaisuus, joka vastaanottaa tulosteen stderr:stä);
  • käytettävissä olevien komentojen hakemiston toteuttaminen (käytettäväksi dir()-funktion kanssa);
  • jne.

viittaukset

  1. smart-env-kirjasto: Github и PyPI
  2. python-shell-kirjasto: Github и PyPI
  3. Telegram-kanava kirjaston päivitykset

UPD23.02.2020:
* Arkistot on siirretty, vastaavat linkit päivitetty
* Versio python-shell==1.0.1 valmistellaan julkaistavaksi 29.02.2020. Muutokset sisältävät komennon automaattisen täydennyksen ja dir(Shell)-komennon tuen, virheellisen Python-tunnisteen sisältävien komentojen suorittamisen ja virheenkorjauksia.

Lähde: will.com

Lisää kommentti