At skabe Python og Bash Friendship: smart-env og python-shell biblioteker

God dag alle sammen.

I dag er Python et af de mest brugte sprog inden for at skabe ikke kun softwareprodukter selv, men også at levere deres infrastruktur. Som følge heraf måtte mange devops, hvad enten de ville eller imod det, lære et nyt sprog til senere brug som supplement til de gode gamle Bash-manuskripter. Men Bash og Python bekender sig til forskellige tilgange til at skrive kode og har visse funktioner, hvilket betyder, at portering af Bash-scripts til "slangesproget" nogle gange viser sig at være en rummelig og langt fra triviel opgave.

For at gøre livet lettere for devops er mange nyttige biblioteker og hjælpeprogrammer i Python blevet oprettet og bliver stadig oprettet. Denne artikel beskriver to nye biblioteker oprettet af forfatteren af ​​dette indlæg - smart-env и python-skal - og designet til at fritage devops fra behovet for at være meget opmærksom på forviklingerne ved at arbejde med Python, hvilket giver plads til mere interessante opgaver. Aktivitetsomfanget for biblioteker er miljøvariabler og lancering af eksterne hjælpeprogrammer.

Alle interesserede, se venligst kat.

Nye "cykler"?

Det ser ud til, hvorfor oprette nye pakker til ret almindelige operationer? Hvad forhindrer dig i at bruge os.environ og subprocess.<metode eller klasse efter eget valg> direkte?

Jeg vil fremlægge beviser til fordel for hvert af bibliotekerne separat.

smart-env bibliotek

Inden du skriver din egen idé, er det nyttigt at gå online og lede efter færdige løsninger. Der er selvfølgelig en risiko for ikke at finde det, du skal bruge, men der er snarere tale om en "forsikringsbegivenhed". Som regel virker denne tilgang og sparer meget tid og kræfter.

Ifølge resultaterne søger følgende blev afsløret:

  • der er pakker, der faktisk ombryder opkald til os.environ, men som samtidig kræver en masse distraherende handlinger (oprettelse af en forekomst af en klasse, specielle parametre i opkald osv.);
  • Der findes gode pakker, som dog er strengt bundet til et specifikt økosystem (primært web-frameworks som Django) og derfor slet ikke er universelle uden en fil;
  • der er sjældne forsøg på at gøre noget nyt. For eksempel, tilføje skrivning og eksplicit parse variabelværdier ved at kalde metoder som
    get_<typename>(var_name)

    Eller her endnu en løsning, som dog ikke understøtter den nu vanærede Python 2 (som trods officielle RIP, der er stadig bjerge af skrevet kode og hele økosystemer);

  • Der er skoleelevers håndværk, der af en eller anden ukendt årsag endte i opstrøms PyPI og kun skaber problemer med navngivningen af ​​nye pakker (især navnet "smart-env" er en nødvendig foranstaltning).

Og denne liste kan fortsætte i lang tid. Men ovenstående punkter var nok til at få mig begejstret for ideen om at lave noget praktisk og universelt.

Krav, der blev sat før skrivning af smart-env:

  • Den mest enkle brugsordning
  • Nem konfigurerbar dataindtastningsunderstøttelse
  • Python 2.7 kompatibel
  • God kodedækning ved test

I sidste ende blev alt dette realiseret. Her er et eksempel på brug:

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

Som du kan se fra eksemplet, for at arbejde med en ny klasse, skal du bare importere den (du behøver ikke at oprette en instans - minus den ekstra handling). Adgang til enhver miljøvariabel opnås ved at henvise til den som en variabel i ENV-klassen, hvilket faktisk gør denne klasse til en intuitiv indpakning for det oprindelige systemmiljø, samtidig med at den omdannes til et muligt konfigurationsobjekt for næsten ethvert system ( en lignende tilgang opnås for eksempel i Django , kun dér er konfigurationsobjektet selve indstillingsmodulet/pakken).

Aktivering/deaktivering af den automatiske skrivestøttetilstand opnås ved hjælp af to metoder - enable_automatic_type_cast() og disable_automatic_type_cast(). Dette kan være praktisk, hvis miljøvariablen indeholder et serialiseret JSON-lignende objekt eller endda bare en boolsk konstant (eksplicit indstilling af DEBUG-variablen i Django ved at sammenligne miljøvariablen med "gyldige" strenge er et af de mest almindelige tilfælde). Men nu er der ingen grund til eksplicit at konvertere strenge - de fleste af de nødvendige handlinger er allerede indlejret i dybden af ​​biblioteket og venter bare på et signal om at handle. 🙂 Generelt fungerer skrivning gennemsigtigt og understøtter næsten alle tilgængelige indbyggede datatyper (frozenset, kompleks og bytes blev ikke testet).

Kravet om at understøtte Python 2 blev implementeret med praktisk talt ingen ofre (opgivelse af maskinskrivning og nogle af "sukkerbolserne" i de seneste versioner af Python 3), især takket være de allestedsnærværende seks (for at løse problemerne med at bruge metaklasser) .

Men der er nogle begrænsninger:

  • Python 3-support betyder version 3.5 og højere (deres tilstedeværelse i dit projekt er resultatet af enten dovenskab eller manglende behov for forbedringer, da det er svært at komme med en objektiv grund til, hvorfor du stadig er på 3.4);
  • I Python 2.7 understøtter biblioteket ikke deserialisering af sæt literaler. Beskrivelse her. Men hvis nogen har lyst til at implementere det, er du velkommen :);

Biblioteket har også en undtagelsesmekanisme i tilfælde af parsingsfejl. Hvis strengen ikke kunne genkendes af nogen af ​​de tilgængelige analysatorer, forbliver værdien en streng (snarere af hensyn til bekvemmelighed og bagudkompatibilitet med den sædvanlige logik for, hvordan variabler fungerer i Bash).

python-shell bibliotek

Nu vil jeg fortælle dig om det andet bibliotek (jeg udelader beskrivelsen af ​​manglerne ved de eksisterende analoger - det ligner det, der er beskrevet for smart-env. Analogs - her и her).

Generelt ligner ideen om implementering og kravene til det dem, der er beskrevet for smart-env, som det kan ses af eksemplet:

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

Ideen er denne:

  1. En enkelt klasse, der repræsenterer Bash i Python-verdenen;
  2. Hver Bash-kommando kaldes som en funktion af Shell-klassen;
  3. Parametrene for hvert funktionskald sendes derefter til det tilsvarende Bash-kommandokald;
  4. Hver kommando udføres "her og nu" i det øjeblik, den kaldes, dvs. den synkrone tilgang virker;
  5. det er muligt at få adgang til outputtet af en kommando i stdout, såvel som dens returkode;
  6. Hvis kommandoen ikke er i systemet, er der en undtagelse.

Som med smart-env er der understøttelse af Python 2 (selvom der var behov for lidt mere offerblod) og ingen understøttelse af Python 3.0-3.4.

Bibliotekets udviklingsplaner

Du kan bruge bibliotekerne nu: begge er lagt ud på den officielle PyPI. Kilder er tilgængelige på Github (se nedenfor).

Begge biblioteker vil blive udviklet under hensyntagen til feedback indsamlet fra interesserede. Og hvis det kan være svært at komme med en række nye funktioner i smart-env, så er der helt sikkert noget andet at tilføje i python-shell:

  • understøttelse af ikke-blokerende opkald;
  • mulighed for interaktiv kommunikation med teamet (arbejde med stdin);
  • tilføjelse af nye egenskaber (for eksempel egenskab for at modtage output fra stderr);
  • implementering af en mappe med tilgængelige kommandoer (til brug med dir()-funktionen);
  • etc.

RЎSЃS <P "RєRё

  1. smart-env bibliotek: Github и PyPI
  2. python-shell bibliotek: Github и PyPI
  3. Telegram kanal biblioteksopdateringer

UPD 23.02.2020/XNUMX/XNUMX:
* Repositories er blevet flyttet, tilsvarende links er blevet opdateret
* Version python-shell==1.0.1 er ved at blive klargjort til udgivelse den 29.02.2020/XNUMX/XNUMX. Ændringer omfatter understøttelse af kommando autofuldførelse og dir(Shell)-kommandoen, kørende kommandoer med en ugyldig Python-id og fejlrettelser.

Kilde: www.habr.com

Tilføj en kommentar