Maak Python en Bash vriende: smart-env en python-shell biblioteke

Goeie dag almal.

Vandag is Python een van die mees gebruikte tale op die gebied om nie net sagtewareprodukte self te skep nie, maar ook om hul infrastruktuur te verskaf. Gevolglik moes baie devops, hetsy deur hul wil of daarteen, 'n nuwe taal aanleer vir latere gebruik as 'n aanvulling op die goeie ou Bash-skrifte. Bash en Python bely egter verskillende benaderings tot die skryf van kode en het sekere kenmerke, wat beteken dat die oordrag van Bash-skrifte na die "slangtaal" soms 'n ruim en ver van triviale taak blyk te wees.

Om die lewe vir devops makliker te maak, is baie nuttige biblioteke en nutsprogramme in Python geskep en word steeds geskep. Hierdie artikel beskryf twee nuwe biblioteke wat deur die skrywer van hierdie pos geskep is - slim-env и luislang-dop - en ontwerp om devops te verlig van die behoefte om baie aandag te skenk aan die ingewikkeldhede van die werk met Python, wat ruimte laat vir meer interessante take. Die omvang van die aktiwiteit van biblioteke is omgewingsveranderlikes en die bekendstelling van eksterne nutsprogramme.

Enige iemand wat belangstel, sien kat asb.

Nuwe "fietse"?

Dit wil voorkom, hoekom nuwe pakkette vir redelik gewone bedrywighede skep? Wat verhoed jou om os.omgewing en subproses.<metode of klas van jou keuse> direk te gebruik?

Ek sal bewys lewer ten gunste van elkeen van die biblioteke afsonderlik.

smart-env-biblioteek

Voordat jy jou eie breinkind skryf, is dit nuttig om aanlyn te gaan en na gereedgemaakte oplossings te soek. Natuurlik is daar 'n risiko om nie te kry wat jy nodig het nie, maar dit is eerder 'n "versekeringsgebeurtenis". As 'n reël werk hierdie benadering en bespaar baie tyd en moeite.

Volgens die uitslae soek die volgende is geopenbaar:

  • daar is pakkette wat eintlik oproepe na os.environ toevou, maar terselfdertyd 'n klomp afleidende aksies vereis (skep van 'n instansie van 'n klas, spesiale parameters in oproepe, ens.);
  • Daar is goeie pakkette, wat egter streng aan 'n spesifieke ekosisteem (hoofsaaklik webraamwerke soos Django) gekoppel is en dus glad nie universeel is sonder 'n lêer nie;
  • daar is seldsame pogings om iets nuuts te doen. Byvoorbeeld, voeg tik by en ontleed veranderlike waardes eksplisiet deur metodes soos
    get_<typename>(var_name)

    Of hier nog een oplossing, wat egter nie die nou skande Python 2 ondersteun nie (wat, ten spyte van amptelike RIP, daar is nog berge geskrewe kode en hele ekosisteme);

  • Daar is handwerk van skoolleerlinge wat om een ​​of ander onbekende rede in die stroomop PyPI beland het en net probleme skep met die naam van nuwe pakkette (veral die naam "slim-env" is 'n noodsaaklike maatstaf).

En hierdie lys kan vir 'n lang tyd aanhou. Bogenoemde punte was egter genoeg om my opgewonde te maak oor die idee om iets gerieflik en universeel te maak.

Vereistes wat gestel is voordat smart-env geskryf is:

  • Die eenvoudigste gebruikskema
  • Maklik konfigureerbare data-tikondersteuning
  • Python 2.7 versoenbaar
  • Goeie kode dekking deur toetse

Uiteindelik is dit alles besef. Hier is 'n voorbeeld van gebruik:

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

Soos u uit die voorbeeld kan sien, moet u dit net invoer om met 'n nuwe klas te werk (jy hoef nie 'n instansie te skep nie - minus die ekstra aksie). Toegang tot enige omgewingsveranderlike word verkry deur daarna te verwys as 'n veranderlike van die ENV-klas, wat in werklikheid hierdie klas 'n intuïtiewe omhulsel vir die inheemse stelselomgewing maak, terwyl dit terselfdertyd in 'n moontlike konfigurasie-objek vir byna enige stelsel verander word ( 'n soortgelyke benadering word byvoorbeeld in Django bereik, net daar is die konfigurasie-objek die instellingsmodule/-pakket self).

Aktivering/deaktivering van die outomatiese tikondersteuningsmodus word bereik met behulp van twee metodes - enable_automatic_type_cast() en disable_automatic_type_cast(). Dit kan gerieflik wees as die omgewingsveranderlike 'n geserialiseerde JSON-agtige voorwerp bevat of selfs net 'n Boole-konstante (om die DEBUG-veranderlike eksplisiet in Django te stel deur die omgewingsveranderlike met "geldige" stringe te vergelyk, is een van die mees algemene gevalle). Maar nou is dit nie nodig om stringe eksplisiet om te skakel nie - die meeste van die nodige aksies is reeds in die dieptes van die biblioteek ingebed en wag net vir 'n sein om op te tree. 🙂 Oor die algemeen werk tik deursigtig en ondersteun byna alle beskikbare ingeboude datatipes (gevriesset, kompleks en grepe is nie getoets nie).

Die vereiste om Python 2 te ondersteun is geïmplementeer met feitlik geen opofferings nie (die laat vaar van tik en sommige van die "suikergoedjies" van die nuutste weergawes van Python 3), veral danksy die alomteenwoordige ses (om die probleme van die gebruik van metaklasse op te los ).

Maar daar is 'n paar beperkings:

  • Python 3-ondersteuning beteken weergawe 3.5 en hoër (hul teenwoordigheid in jou projek is die gevolg van óf luiheid óf gebrek aan behoefte aan verbeterings, aangesien dit moeilik is om met 'n objektiewe rede vorendag te kom waarom jy steeds op 3.4 is);
  • In Python 2.7 ondersteun die biblioteek nie deserialisering van stelletters nie. Beskrywing hier. Maar as iemand dit wil implementeer, is jy welkom :);

Die biblioteek het ook 'n uitsonderingsmeganisme in die geval van ontledingfoute. As die string nie deur enige van die beskikbare ontleders herken kon word nie, bly die waarde 'n string (eerder vir gerieflikheidsredes en terugwaartse versoenbaarheid met die gewone logika van hoe veranderlikes in Bash werk).

python-shell-biblioteek

Nou sal ek jou vertel van die tweede biblioteek (ek sal die beskrywing van die tekortkominge van die bestaande analoë weglaat - dit is soortgelyk aan dié wat beskryf word vir smart-env. Analogues - hier и hier).

Oor die algemeen is die idee van implementering en die vereistes daarvoor soortgelyk aan dié wat vir smart-env beskryf word, soos uit die voorbeeld gesien kan word:

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

Die idee is dit:

  1. 'n Enkele klas wat Bash in die Python-wêreld verteenwoordig;
  2. Elke Bash-opdrag word genoem as 'n funksie van die Shell-klas;
  3. Die parameters vir elke funksie-oproep word dan in die ooreenstemmende Bash-opdragoproep deurgegee;
  4. Elke opdrag word "hier en nou" uitgevoer op die oomblik wat dit genoem word, m.a.w. die sinchrone benadering werk;
  5. dit is moontlik om toegang te verkry tot die uitvoer van 'n opdrag in stdout, sowel as sy terugkeerkode;
  6. As die opdrag nie in die stelsel is nie, word 'n uitsondering gegooi.

Soos met smart-env, is daar ondersteuning vir Python 2 (alhoewel 'n bietjie meer offerbloed nodig was) en geen ondersteuning vir Python 3.0-3.4 nie.

Biblioteekontwikkelingsplanne

Jy kan die biblioteke nou gebruik: albei word op die amptelike PyPI geplaas. Bronne is beskikbaar op Github (sien hieronder).

Beide biblioteke sal ontwikkel word met inagneming van terugvoer wat van belangstellendes ingesamel is. En as dit dalk moeilik is om met 'n verskeidenheid nuwe kenmerke in smart-env vorendag te kom, dan is daar in python-shell beslis iets anders om by te voeg:

  • ondersteuning vir nie-blokkerende oproepe;
  • moontlikheid van interaktiewe kommunikasie met die span (werk met stdin);
  • byvoeging van nuwe eiendomme (byvoorbeeld eiendom om uitset van stderr te ontvang);
  • implementering van 'n gids van beskikbare opdragte (vir gebruik met die dir()-funksie);
  • ens.

verwysings

  1. smart-env biblioteek: GitHub и PyPI
  2. python-shell biblioteek: GitHub и PyPI
  3. Telegram kanaal biblioteekopdaterings

UPD 23.02.2020/XNUMX/XNUMX:
* Bewaarplekke is geskuif, ooreenstemmende skakels is opgedateer
* Weergawe python-shell==1.0.1 word voorberei vir vrystelling op 29.02.2020/XNUMX/XNUMX. Veranderinge sluit in ondersteuning vir opdrag outovoltooi en die dir(Shell) opdrag, lopende opdragte met 'n ongeldige Python identifiseerder, en foutoplossings.

Bron: will.com

Voeg 'n opmerking