Making Python and Bash Friendship: smart-env og python-shell-biblioteker

God dag alle sammen.

I dag er Python et av de mest brukte språkene når det gjelder å lage ikke bare programvareprodukter selv, men også levere infrastrukturen deres. Som et resultat måtte mange devops, enten det var med vilje eller mot det, lære et nytt språk for senere bruk som et supplement til de gode gamle Bash-manusene. Imidlertid bekjenner Bash og Python forskjellige tilnærminger til å skrive kode og har visse funksjoner, noe som betyr at portering av Bash-skript til "slangespråket" noen ganger viser seg å være en romslig og langt fra triviell oppgave.

For å gjøre livet enklere for devops har mange nyttige biblioteker og verktøy i Python blitt opprettet og blir fortsatt opprettet. Denne artikkelen beskriver to nye biblioteker opprettet av forfatteren av dette innlegget - smart-env и python-skall - og designet for å avlaste devops fra behovet for å betale mye oppmerksomhet til vanskelighetene ved å jobbe med Python, noe som gir rom for mer interessante oppgaver. Aktivitetsomfanget til biblioteker er miljøvariabler og lansering av eksterne verktøy.

Alle som er interessert, se katt.

Nye "sykler"?

Det ser ut til, hvorfor lage nye pakker for ganske ordinære operasjoner? Hva hindrer deg i å bruke os.environ og subprocess.<metode eller klasse etter eget valg> direkte?

Jeg vil gi bevis til fordel for hvert av bibliotekene separat.

smart-env-bibliotek

Før du skriver ditt eget hjernebarn, er det nyttig å gå på nett og se etter ferdige løsninger. Selvfølgelig er det en risiko for å ikke finne det du trenger, men dette er snarere en "forsikringshendelse". Som regel fungerer denne tilnærmingen og sparer mye tid og krefter.

I følge resultatene Søk følgende ble avslørt:

  • det er pakker som faktisk bryter kall til os.environ, men som samtidig krever en haug med distraherende handlinger (opprette en forekomst av en klasse, spesielle parametere i samtaler, etc.);
  • Det finnes gode pakker, som imidlertid er strengt knyttet til et spesifikt økosystem (hovedsakelig web-rammeverk som Django) og derfor slett ikke er universelle uten en fil;
  • det er sjeldne forsøk på å gjøre noe nytt. For eksempel, legg til skriving og eksplisitt analysere variabelverdier ved å kalle metoder som
    get_<typename>(var_name)

    Eller her enda en løsning, som imidlertid ikke støtter den nå vanærede Python 2 (som til tross for offisiell RIP, det er fortsatt fjell med skrevet kode og hele økosystemer);

  • Det er skoleelev håndverk som, av en eller annen ukjent grunn, havnet i oppstrøms PyPI og bare skaper problemer med navngivning av nye pakker (spesielt navnet "smart-env" er et nødvendig tiltak).

Og denne listen kan fortsette i lang tid. Imidlertid var punktene ovenfor nok til å få meg begeistret for ideen om å lage noe praktisk og universelt.

Krav som ble satt før du skrev smart-env:

  • Den enkleste bruksordningen
  • Enkelt konfigurerbar dataskrivingsstøtte
  • Python 2.7-kompatibel
  • God kodedekning ved tester

Til slutt ble alt dette realisert. Her er et eksempel på bruk:

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 å jobbe med en ny klasse, trenger du bare å importere den (du trenger ikke å opprette en forekomst - minus den ekstra handlingen). Tilgang til en hvilken som helst miljøvariabel oppnås ved å referere til den som en variabel i ENV-klassen, noe som faktisk gjør denne klassen til en intuitiv innpakning for det opprinnelige systemmiljøet, samtidig som den gjør den om til et mulig konfigurasjonsobjekt for nesten alle system ( en lignende tilnærming, for eksempel, oppnås i Django , bare der er konfigurasjonsobjektet selve innstillingsmodulen/pakken).

Aktivering/deaktivering av støttemodus for automatisk skriving oppnås ved hjelp av to metoder - enable_automatic_type_cast() og disable_automatic_type_cast(). Dette kan være praktisk hvis miljøvariabelen inneholder et serialisert JSON-lignende objekt eller til og med bare en boolsk konstant (eksplisitt å sette DEBUG-variabelen i Django ved å sammenligne miljøvariabelen med "gyldige" strenger er en av de vanligste tilfellene). Men nå er det ikke nødvendig å eksplisitt konvertere strenger - de fleste av de nødvendige handlingene er allerede innebygd i dypet av biblioteket og venter bare på et signal om å handle. 🙂 Generelt fungerer skriving transparent og støtter nesten alle tilgjengelige innebygde datatyper (frozenset, complex og bytes ble ikke testet).

Kravet om å støtte Python 2 ble implementert med praktisk talt ingen ofre (oppgivelse av skriving og noen av "sukkergodteriene" i de nyeste versjonene av Python 3), spesielt takket være de allestedsnærværende seks (for å løse problemene med å bruke metaklasser ).

Men det er noen begrensninger:

  • Python 3-støtte betyr versjon 3.5 og høyere (deres tilstedeværelse i prosjektet ditt er et resultat av enten latskap eller mangel på behov for forbedringer, siden det er vanskelig å komme opp med en objektiv grunn til at du fortsatt er på 3.4);
  • I Python 2.7 støtter ikke biblioteket deserialisering av settliteraler. Beskrivelse her. Men hvis noen vil implementere det, er du velkommen :);

Biblioteket har også en unntaksmekanisme i tilfelle parsefeil. Hvis strengen ikke kunne gjenkjennes av noen av de tilgjengelige analysatorene, forblir verdien en streng (snarere av bekvemmelighetshensyn og bakoverkompatibilitet med den vanlige logikken for hvordan variabler fungerer i Bash).

python-shell-bibliotek

Nå skal jeg fortelle deg om det andre biblioteket (jeg utelater beskrivelsen av manglene til de eksisterende analogene - det ligner det som er beskrevet for smart-env. Analoges - her и her).

Generelt er ideen om implementering og kravene til den lik de som er beskrevet for smart-env, som man kan se fra eksempelet:

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

Tanken er denne:

  1. En enkelt klasse som representerer Bash i Python-verdenen;
  2. Hver Bash-kommando kalles som en funksjon av Shell-klassen;
  3. Parametrene for hvert funksjonskall sendes deretter til det tilsvarende Bash-kommandokallet;
  4. Hver kommando utføres "her og nå" i det øyeblikket den kalles, dvs. den synkrone tilnærmingen fungerer;
  5. det er mulig å få tilgang til utgangen av en kommando i stdout, så vel som returkoden;
  6. Hvis kommandoen ikke er i systemet, blir et unntak kastet.

Som med smart-env er det støtte for Python 2 (selv om det var nødvendig med litt mer offerblod) og ingen støtte for Python 3.0-3.4.

Bibliotekets utviklingsplaner

Du kan bruke bibliotekene nå: begge er lagt ut på den offisielle PyPI. Kilder er tilgjengelige på Github (se nedenfor).

Begge bibliotekene vil bli utviklet under hensyntagen til tilbakemeldinger fra interesserte. Og hvis det kan være vanskelig å komme opp med en rekke nye funksjoner i smart-env, så i python-shell er det definitivt noe annet å legge til:

  • støtte for ikke-blokkerende samtaler;
  • mulighet for interaktiv kommunikasjon med teamet (arbeide med stdin);
  • legge til nye egenskaper (for eksempel eiendom for å motta utdata fra stderr);
  • implementering av en katalog med tilgjengelige kommandoer (for bruk med dir()-funksjonen);
  • etc.

referanser

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

UPD 23.02.2020:
* Repositories har blitt flyttet, tilsvarende lenker er oppdatert
* Versjon python-shell==1.0.1 forberedes for utgivelse 29.02.2020. Endringer inkluderer støtte for kommando autofullføring og dir(Shell)-kommandoen, kjørende kommandoer med en ugyldig Python-identifikator og feilrettinger.

Kilde: www.habr.com

Legg til en kommentar