Gerðu Python og Bash Friendship: snjall-env og python-skel bókasöfn

Góðan daginn allir saman.

Í dag er Python eitt mest notaða tungumálið á því sviði að búa til ekki aðeins hugbúnaðarvörur sjálfir, heldur einnig að útvega innviði þeirra. Fyrir vikið þurftu margir devopar, hvort sem þeir vilja eða gegn honum, að læra nýtt tungumál til síðari nota sem viðbót við gömlu góðu Bash-handritin. Hins vegar segja Bash og Python ólíkar aðferðir við að skrifa kóða og hafa ákveðna eiginleika, sem þýðir að flytja Bash forskriftir yfir á „snákamálið“ reynist stundum vera umfangsmikið og langt frá því að vera léttvægt verkefni.

Til að gera lífið auðveldara fyrir devops hafa mörg gagnleg bókasöfn og tól í Python verið búin til og halda áfram að búa til. Þessi grein lýsir tveimur nýjum bókasöfnum sem höfundur þessarar færslu hefur búið til - smart-env и python-skel - og hannað til að létta devops frá þörfinni á að borga mikla athygli á ranghala vinnu með Python, sem gefur pláss fyrir áhugaverðari verkefni. Starfssvið bókasafna er umhverfisbreytur og að koma ytri tólum af stað.

Áhugasamir, vinsamlegast sjá kött.

Ný "hjól"?

Það virðist, hvers vegna að búa til nýja pakka fyrir nokkuð venjulegan rekstur? Hvað kemur í veg fyrir að þú notir os.environ og subprocess.<aðferð eða flokk að eigin vali> beint?

Ég mun leggja fram sönnunargögn í þágu hvers bókasafns fyrir sig.

smart-env bókasafn

Áður en þú skrifar eigin hugarfóstur er gagnlegt að fara á netið og leita að tilbúnum lausnum. Auðvitað er hætta á að þú finnir ekki það sem þú þarft, en þetta er frekar „tryggingaratburður“. Að jafnaði virkar þessi aðferð og sparar mikinn tíma og fyrirhöfn.

Samkvæmt niðurstöðunum leit kom eftirfarandi í ljós:

  • það eru pakkar sem í raun vefja símtöl í os.environ, en á sama tíma krefjast fullt af truflandi aðgerðum (að búa til tilvik af flokki, sérstakar breytur í símtölum, osfrv.);
  • Það eru til góðir pakkar, sem þó eru stranglega bundnir við ákveðið vistkerfi (aðallega veframma eins og Django) og eru því alls ekki algildir án skráar;
  • það eru sjaldgæfar tilraunir til að gera eitthvað nýtt. Til dæmis, bæta við vélritun og greint greinilega breytugildi með því að kalla aðferðir eins og
    get_<typename>(var_name)

    Eða hér enn ein lausnin, sem hins vegar styður ekki Python 2 sem nú er til skammar (sem þrátt fyrir opinber RIP, það eru enn fjöll af rituðum kóða og heilum vistkerfum);

  • Það er til handverk skólanema sem, af einhverjum óþekktum ástæðum, endaði í andstreymis PyPI og skapar aðeins vandamál með nafngiftir nýrra pakka (sérstaklega er nafnið „smart-env“ nauðsynleg ráðstöfun).

Og þessi listi getur haldið áfram í langan tíma. Hins vegar voru ofangreind atriði nóg til að vekja mig spennt fyrir hugmyndinni um að búa til eitthvað þægilegt og alhliða.

Kröfur sem voru settar áður en smart-env var skrifað:

  • Einfaldasta notkunarkerfið
  • Auðveldlega stillanlegur gagnasláttustuðningur
  • Python 2.7 samhæft
  • Góð kóða umfang með prófum

Að lokum varð allt þetta að veruleika. Hér er dæmi um notkun:

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

Eins og þú sérð af dæminu, til að vinna með nýjan flokk þarftu bara að flytja hann inn (þú þarft ekki að búa til tilvik - að frádregnum aukaaðgerðinni). Aðgangur að hvaða umhverfisbreytu sem er fæst með því að vísa til hennar sem breytu ENV flokksins, sem í raun gerir þennan flokk að leiðandi umbúðir fyrir innfædda kerfisumhverfið, en um leið breytir honum í mögulegan uppsetningarhlut fyrir næstum hvaða kerfi sem er ( svipuð nálgun, til dæmis, er náð í Django, aðeins þar er stillingarhluturinn sjálfur stillingareiningin/pakkinn).

Að virkja/slökkva á sjálfvirkri innsláttarstuðningsstillingu er náð með tveimur aðferðum - enable_automatic_type_cast() og disable_automatic_type_cast(). Þetta getur verið þægilegt ef umhverfisbreytan inniheldur raðtendan JSON-líkan hlut eða jafnvel bara Boolean fasta (að stilla DEBUG breytuna beinlínis í Django með því að bera umhverfisbreytuna saman við „gilda“ strengi er eitt algengasta tilvikið). En nú er engin þörf á að umbreyta strengjum beinlínis - flestar nauðsynlegar aðgerðir eru þegar felldar inn í djúp bókasafnsins og eru bara að bíða eftir merki um að bregðast við. 🙂 Almennt séð virkar innsláttur gagnsær og styður næstum allar tiltækar innbyggðar gagnategundir (frosið sett, flókið og bæti voru ekki prófuð).

Krafan um að styðja Python 2 var innleidd með nánast engum fórnum (hætt við að vélrita og sum "sykurkonfekt" í nýjustu útgáfum Python 3), sérstaklega þökk sé alls staðar sex (til að leysa vandamálin við að nota metaclasses ).

En það eru nokkrar takmarkanir:

  • Python 3 stuðningur þýðir útgáfa 3.5 og hærri (tilvist þeirra í verkefninu þínu er afleiðing annaðhvort leti eða skorts á þörf fyrir endurbætur, þar sem það er erfitt að koma með hlutlæga ástæðu fyrir því að þú ert enn á 3.4);
  • Í Python 2.7 styður bókasafnið ekki deserialization settra bókstafa. Lýsing hér. En ef einhver vill koma því í framkvæmd þá ertu velkominn :);

Bókasafnið hefur einnig undantekningarkerfi ef um er að ræða þáttunarvillur. Ef strengurinn gæti ekki verið þekktur af neinum af tiltækum greiningartækjum, er gildið áfram strengur (frekar, af þægindaástæðum og afturábak samhæfni við venjulega rökfræði hvernig breytur virka í Bash).

python-skel bókasafn

Nú skal ég segja þér frá öðru bókasafninu (ég mun sleppa lýsingunni á göllum núverandi hliðstæðna - það er svipað og lýst er fyrir snjallumhverfishliðstæður - hér и hér).

Almennt séð eru hugmyndin um innleiðingu og kröfurnar fyrir hana svipaðar þeim sem lýst er fyrir smart-env, eins og sjá má af dæminu:

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

Hugmyndin er þessi:

  1. Einn flokkur sem táknar Bash í Python heiminum;
  2. Hver Bash skipun er kölluð sem fall af Shell bekknum;
  3. Færibreyturnar fyrir hvert fallkall eru síðan sendar inn í samsvarandi Bash skipanakall;
  4. Hver skipun er framkvæmd „hér og nú“ á því augnabliki sem hún er kölluð, þ.e. samstillta nálgunin virkar;
  5. það er hægt að nálgast úttak skipunar í stdout, sem og skilakóða hennar;
  6. Ef skipunin er ekki í kerfinu er undantekning hent.

Eins og með smart-env, þá er stuðningur fyrir Python 2 (þó að aðeins meira fórnarblóð hafi verið krafist) og enginn stuðningur fyrir Python 3.0-3.4.

Þróunaráætlanir bókasafna

Þú getur notað bókasöfnin núna: bæði eru birt á opinberu PyPI. Heimildir eru fáanlegar á Github (sjá hér að neðan).

Bæði bókasöfnin verða þróuð með hliðsjón af áliti sem safnað er frá áhugasömum. Og ef það gæti verið erfitt að koma með ýmsa nýja eiginleika í smart-env, þá er örugglega eitthvað annað að bæta við í python-shell:

  • stuðningur við símtöl sem ekki eru læst;
  • möguleiki á gagnvirkum samskiptum við teymið (vinna með stdin);
  • bæta við nýjum eiginleikum (til dæmis eign til að fá úttak frá stderr);
  • útfærsla á skrá yfir tiltækar skipanir (til notkunar með dir() aðgerðinni);
  • o.fl.

tilvísanir

  1. smart-env bókasafn: GitHub и PyPI
  2. Python-skel bókasafn: GitHub и PyPI
  3. Telegram rás uppfærslur á bókasafni

UPD 23.02.2020/XNUMX/XNUMX:
* Geymslur hafa verið færðar, samsvarandi tenglar hafa verið uppfærðir
* Verið er að undirbúa útgáfu python-shell==1.0.1 fyrir útgáfu 29.02.2020. Breytingar fela í sér stuðning við sjálfvirka útfyllingu skipana og dir(Shell) skipunina, keyrslu skipanir með ógildu Python auðkenni og villuleiðréttingar.

Heimild: www.habr.com

Bæta við athugasemd