Förenar Python och Bash: biblioteken smart-env och python-shell

God eftermiddag alla.

I dag Àr Python ett av de mest anvÀnda sprÄken inom skapandet av inte bara programvaruprodukter, utan ocksÄ för att sÀkerstÀlla deras infrastruktur. Som ett resultat av detta har mÄnga DevOps, oavsett om de vill eller inte, fÄtt lÀra sig ett nytt sprÄk för att anvÀnda det som komplement till de gamla goda Bash-skripten. Dock har Bash och Python olika tillvÀgagÄngssÀtt för att skriva kod och har vissa sÀrdrag, vilket gör att portering av Bash-skript till "ormsprÄket" ibland kan vara en omfattande och lÄngt ifrÄn trivial uppgift.

För att underlĂ€tta livet för DevOps har mĂ„nga anvĂ€ndbara bibliotek och verktyg pĂ„ Python skapats och fortsĂ€tter att skapas. Denna artikel beskriver tvĂ„ nya bibliotek, som skapats av författaren till detta inlĂ€gg — smart-env och python-shell — som syftar till att befria DevOps frĂ„n att behöva Ă€gna mycket uppmĂ€rksamhet Ă„t detaljerna i att arbeta med Python, och dĂ€rmed istĂ€llet ge utrymme för mer intressanta uppgifter. Bibliotekens verksamhetsfĂ€lt Ă€r miljövariabler och körning av externa verktyg.

Den som Àr intresserad Àr vÀlkommen vidare.

Nya "cyklar"?

Vad skulle anledningen vara att skapa nya paket för tillrÀckligt vardagliga operationer? Vad hindrar oss frÄn att anvÀnda os.environ och subprocess direkt. ?

Jag kommer att ge bevis för varje av biblioteken separat.

Biblioteket smart-env

Innan du skriver ditt eget projekt kan det vara bra att kolla pÄ nÀtet och söka efter fÀrdiga lösningar. SjÀlvklart finns det en risk att inte hitta det du behöver, men detta Àr snarare en "försÀkringsfrÄga". Vanligtvis slÄr den hÀr metoden igenom och sparar mycket tid och energi.

Enligt resultaten av sökning var följande upplysningar efterforskningen:

  • det finns paket som verkligen kapslar in anropen till os.environ, men som krĂ€ver mycket avledande Ă„tgĂ€rder (skapande av instanser av klasser, speciella parametrar i anrop mm.);
  • det finns ganska bra paket, som dock Ă€r starkt kopplade till en viss ekosystem (frĂ€mst webbsyften som Django) och dĂ€rmed inte alls universella utan en smĂ€rre modifiering;
  • Det finns sĂ€llsynta försök att göra nĂ„got nytt. Till exempel lĂ€gga till typning och tydligt parsa vĂ€rden pĂ„ variabler genom att anropa metoder av typen
    get_(var_namn)

    Eller hÀr Àr Ànnu en lösning, som dock inte stödjer den numera förkastade Python 2 (pÄ vilken, trots allt, officiell R.I.P., det finns fortfarande berg av skriven kod och hela ekosystem);

  • det finns skolstudentprojekt, som överhuvudtaget inte förstĂ„s varför de hamnade i upstream PyPI och bara skapar problem med namngivningen av nya paket (sĂ€rskilt namnet "smart-env" — en nödlösning).

Och denna lista kan fortsÀtta lÀnge. Men de ovan nÀmnda punkterna rÀckte för att tÀnda idén om att skapa nÄgot praktiskt och universellt.

Krav som stÀlldes inför skapandet av smart-env:

  • Maximalt enkel anvĂ€ndning
  • LĂ€tt att konfigurera datatypsstöd
  • Kompatibilitet med Python 2.7
  • Bra testtĂ€ckning av koden

Slutligen lyckades allt detta att genomföras. HÀr Àr ett exempel pÄ anvÀndning:

from smart_env import ENV

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

# förutsatt att du har stÀllt in miljövariabeln MYVAR till "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Lika med boolean True

ENV.NEW_VAR = 100  # SÀtter en ny miljövariabel

Som visas i exemplet Ă€r det tillrĂ€ckligt att importera den nya klassen (det behövs ingen instansiering — minus en extra Ă„tgĂ€rd). Åtkomst till vilken miljövariabel som helst uppnĂ„s genom att referera till den som en klassvariabel i ENV, vilket i praktiken gör denna klass till ett intuitivt förstĂ„eligt omslag av det inbyggda systemmiljön, samtidigt som den gör det till ett möjligt alternativ för konfigurationsobjekt i praktiskt taget vilket system som helst (en liknande metod uppnĂ„s t.ex. i Django, dĂ€r konfigurationsobjektet Ă€r modulen/paketet settings).

Aktivering/deaktivering av stöd för automatisk typkonvertering uppnĂ„s med hjĂ€lp av tvĂ„ metoder — enable_automatic_type_cast() och disable_automatic_type_cast(). Detta kan vara praktiskt om det finns ett serialiserat JSON-liknande objekt eller till och med bara en boolesk konstant (den explicita deklarationen av variabeln DEBUG i Django genom att jĂ€mföra miljövariabeln med "tillĂ„tna" strĂ€ngar — ett av de vanligaste fallen). Men nu Ă€r det inte nödvĂ€ndigt att konvertera strĂ€ngar explicit — de flesta nödvĂ€ndiga Ă„tgĂ€rderna Ă€r redan inbyggda i biblioteket och vĂ€ntar bara pĂ„ en signal att agera. 🙂 I allmĂ€nhet fungerar typkonverteringen transparent och stöder nĂ€stan alla inbyggda datatyper (frozenset, complex och bytes har inte testats).

Kravet pÄ Python 2-stöd har implementerats praktiskt taget utan offer (avstÄende frÄn typing och nÄgra "godisbitar" frÄn de senaste versionerna av Python 3), sÀrskilt tack vare den allestÀdes nÀrvarande six (för att lösa problem med anvÀndningen av metaklasser).

Men det finns ocksÄ nÄgra begrÀnsningar:

  • Stödet för Python 3 innebĂ€r version 3.5 och högre (existensen av dem i ditt projekt Ă€r ett resultat av antingen lathet eller brist pĂ„ behov av förbĂ€ttringar, eftersom det Ă€r svĂ„rt att förestĂ€lla sig en objektiv anledning till varför du fortfarande sitter pĂ„ 3.4);
  • I Python 2.7 stödjer biblioteket inte deserialisering av mĂ€ngdlitteraler. Beskrivning ). Ett typiskt exempel pĂ„ anvĂ€ndning:. Men om nĂ„gon vill implementera det – vĂ€lkommen;)

Biblioteket har ocksÄ en undantagsmekanism för fall av parseringsfel. Om en strÀng inte kunde igenkÀnnas av nÄgon av de tillgÀngliga parserarna, förblir vÀrdet en strÀng (snarare av bekvÀmlighet och bakÄtkompatibilitet med den vanliga logiken för variabler i Bash).

Biblioteket python-shell

Nu kommer jag att berĂ€tta om det andra biblioteket (beskrivning av bristerna hos de befintliga alternativen lĂ€mnar jag ut – det liknar det som beskrivits för smart-env. Alternativ Ă€r – ). Ett typiskt exempel pĂ„ anvĂ€ndning: och ). Ett typiskt exempel pĂ„ anvĂ€ndning:).

Generellt Àr idén med implementeringen och kraven pÄ den liknande de som beskrivits för smart-env, vilket framgÄr av exemplet:

from python_shell import Shell

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

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # skriver ut ditt nuvarande anvÀndarnamn

print(command.command)  # skriver ut "whoami"
print(command.return_code)  # skriver ut "0"
print(command.arguments)  # skriver ut ""

Shell.mkdir('-p', '\/tmp\/new_folder')  # skapar en ny mapp

Idén Àr följande:

  1. En enda klass som personifierar Bash i Python-vÀrlden;
  2. Varje Bash-kommando anropas som en klassfunktion;
  3. Parametrarna för anropet av varje funktion vidarebefordras till anropet av motsvarande Bash-kommando;
  4. Varje kommando utförs "hÀr och nu" vid anropet, det vill sÀga en synkron metod tillÀmpas;
  5. det finns möjlighet att fÄ Ätkomst till kommandots utdata i stdout samt dess returkod;
  6. Om kommandot saknas i systemet kastas ett undantag.

Precis som med smart-env sĂ€kerstĂ€lls stöd för Python 2 (Ă€ven om det krĂ€vdes nĂ„got mer offer) och stöd för Python 3.0–3.4 saknas.

Utvecklingsplaner för biblioteken

Biblioteken kan anvÀndas redan nu: bÄda har publicerats pÄ officiella PyPI. KÀllkoden finns tillgÀnglig pÄ Github (se nedan).

BÄda biblioteken kommer att utvecklas med hÀnsyn till den feedback som samlats frÄn intresserade. Och om det kan vara svÄrt att komma pÄ olika nya funktioner för smart-env, sÄ finns det definitivt mer att lÀgga till i python-shell:

  • stöd för icke-blockerande anrop;
  • möjlighet till interaktiv kommunikation med teamet (arbete med stdin);
  • tillĂ€gg av nya egenskaper (t.ex. property för att hĂ€mta utdata frĂ„n stderr);
  • implementering av en katalog med tillgĂ€ngliga kommandon (för anvĂ€ndning med funktionen dir());
  • och sĂ„ vidare.

LĂ€nkar

  1. Biblioteket smart-env: Github och PyPI
  2. Biblioteket python-shell: Github och PyPI
  3. Telegram-kanal uppdateringar av biblioteken

UPD 23.02.2020:
* FörrÄd har flyttats, motsvarande lÀnkar har uppdaterats
* Versionen python-shell==1.0.1 förbereds för lansering den 29.02.2020. Bland Àndringarna finns stöd för autokomplettering av kommandon och kommandot dir(Shell), körning av kommandon med Python- ogiltiga identifierare, buggfixar.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster