Python en Bash Friendship meitsje: smart-env en python-shell bibleteken

Goeie dei allegearre.

Hjoed is Python ien fan 'e meast brûkte talen op it mêd fan it meitsjen fan net allinich softwareprodukten sels, mar ek it leverjen fan har ynfrastruktuer. Dêrtroch moasten in protte devops, itsij troch har wil of tsjin, in nije taal leare foar letter gebrûk as oanfolling op de goede âlde Bash-skriften. Bash en Python belje lykwols ferskate oanpak foar it skriuwen fan koade en hawwe bepaalde funksjes, wat betsjuttet dat it portearjen fan Bash-skripts nei de "slangtaal" soms in romige en fier fan triviale taak blykt te wêzen.

Om it libben makliker te meitsjen foar devops, binne in protte nuttige biblioteken en nutsfoarsjenningen yn Python makke en wurde noch oanmakke. Dit artikel beskriuwt twa nije bibleteken makke troch de skriuwer fan dizze post - smart-env и python-shell - en ûntworpen om devops te ûntlêsten fan 'e needsaak om in protte omtinken te jaan oan' e yngewikkeldheden fan wurkjen mei Python, wêrtroch romte is foar mear nijsgjirrige taken. De omfang fan aktiviteit fan biblioteken is omjouwingsfariabelen en it lansearjen fan eksterne nutsbedriuwen.

Elkenien ynteressearre, sjoch kat.

Nije "fytsen"?

It soe lykje, wêrom meitsje nije pakketten foar frij gewoane operaasjes? Wat foarkomt dat jo os.environ en subprocess.<metoade of klasse fan jo kar> direkt brûke?

Ik sil bewiis leverje yn it foardiel fan elk fan 'e bibleteken apart.

smart-env bibleteek

Foardat jo jo eigen geast skriuwe, is it handich om online te gean en te sykjen nei klearmakke oplossingen. Fansels is d'r in risiko dat jo net fine wat jo nedich binne, mar dit is earder in "fersekeringsevenemint". As regel wurket dizze oanpak en besparret in protte tiid en muoite.

Neffens de resultaten sykje it folgjende waard iepenbiere:

  • d'r binne pakketten dy't eins oproppen nei os.environ wrapje, mar tagelyk in bulte ôfliedende aksjes fereaskje (it meitsjen fan in eksimplaar fan in klasse, spesjale parameters yn petearen, ensfh.);
  • D'r binne goede pakketten, dy't lykwols strikt ferbûn binne oan in spesifyk ekosysteem (benammen web-frameworks lykas Django) en dus hielendal net universeel binne sûnder in triem;
  • der binne seldsume pogingen om wat nijs te dwaan. Bygelyks, tafoegje typen en eksplisyt fariabele wearden parse troch metoaden te roppen lykas
    get_<typename>(var_name)

    Of hjir noch ien oplossing, dy't lykwols de no skande Python 2 net stipet (dy't, nettsjinsteande offisjele RIP, der binne noch bergen fan skreaune koade en hiele ekosystemen);

  • d'r binne ambachten fan skoalle-learlingen dy't, om ien of oare ûnbekende reden, yn upstream PyPI telâne kommen en allinich problemen meitsje mei de nammejouwing fan nije pakketten (benammen de namme "smart-env" is in needsaaklike maatregel).

En dizze list kin in lange tiid trochgean. De boppesteande punten wiene lykwols genôch om my optein te meitsjen oer it idee om wat handich en universeel te meitsjen.

Easken dy't waarden ynsteld foar it skriuwen fan smart-env:

  • De meast ienfâldige gebrûk skema
  • Maklik ynstelbere stipe foar gegevenstypen
  • Python 2.7 kompatibel
  • Goede koade dekking troch tests

Uteinlik waard dit alles realisearre. Hjir is in foarbyld fan gebrûk:

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

Sa't jo út it foarbyld sjen kinne, om mei in nije klasse te wurkjen, moatte jo it gewoan ymportearje (jo hoege gjin eksimplaar te meitsjen - minus de ekstra aksje). Tagong ta elke omjouwingsfariabele wurdt berikt troch it te ferwizen as in fariabele fan 'e ENV-klasse, wat dizze klasse yn feite in yntuïtive wrapper makket foar de native systeemomjouwing, wylst it tagelyk omset yn in mooglik konfiguraasjeobjekt foar hast elk systeem ( in ferlykbere oanpak, bygelyks, wurdt berikt yn Django , allinnich dêr is de konfiguraasje foarwerp de ynstellings module / pakket sels).

It ynskeakeljen / útskeakeljen fan de automatyske typen stipe modus wurdt berikt mei help fan twa metoaden - enable_automatic_type_cast () en disable_automatic_type_cast (). Dit kin handich wêze as de omjouwingsfariabele in serialisearre JSON-lykas foarwerp befettet of sels gewoan in Booleaanske konstante (eksplisyt de DEBUG-fariabele yn Django ynstelle troch de omjouwingsfariabele te fergelykjen mei "jildich" stringen is ien fan 'e meast foarkommende gefallen). Mar no is d'r gjin need nedich om stringen eksplisyt te konvertearjen - de measte fan 'e nedige aksjes binne al ynbêde yn' e djipten fan 'e bibleteek en wachtsje gewoan op in sinjaal om te hanneljen. 🙂 Yn it algemien wurket typen transparant en stipet hast alle beskikbere ynboude gegevenstypen (frozenset, kompleks en bytes waarden net hifke).

De eask om Python 2 te stypjen waard ymplementearre mei praktysk gjin opofferings (it ferlitten fan typen en guon fan 'e "sûker-sûkelarje" fan 'e lêste ferzjes fan Python 3), benammen troch de ubiquitêre seis (om de problemen fan it brûken fan metaklassen op te lossen) .

Mar d'r binne wat beheiningen:

  • Python 3-stipe betsjut ferzje 3.5 en heger (har oanwêzigens yn jo projekt is it gefolch fan luiheid of gebrek oan ferlet fan ferbetteringen, om't it dreech is om in objektive reden te kommen wêrom't jo noch op 3.4 binne);
  • Yn Python 2.7 stipet de bibleteek gjin deserialisaasje fan ynstelde letteren. Beskriuwing hjir. Mar as immen it útfiere wol, dan binne jo wolkom :);

De bibleteek hat ek in útsûnderingsmeganisme yn gefal fan parseerfouten. As de tekenrige net koe wurde erkend troch ien fan 'e beskikbere analysatoren, bliuwt de wearde in tekenrige (leaver, om redenen fan gemak en efterkompatibiliteit mei de gewoane logika fan hoe't fariabelen wurkje yn Bash).

python-shell bibleteek

No sil ik jo fertelle oer de twadde bibleteek (ik sil de beskriuwing fan 'e tekoarten fan' e besteande analogen weglitte - it is fergelykber mei dy beskreaun foar smart-env. Analogen - hjir и hjir).

Yn 't algemien binne it idee fan ymplemintaasje en de easken dêrfoar fergelykber mei dy beskreaun foar smart-env, lykas kin wurde sjoen út it foarbyld:

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

It idee is dit:

  1. In inkele klasse dy't Bash yn 'e Python-wrâld fertsjintwurdiget;
  2. Elts Bash kommando wurdt neamd as funksje fan de Shell klasse;
  3. De parameters foar eltse funksje oprop wurde dan trochjûn yn de korrespondearjende Bash kommando oprop;
  4. Elk kommando wurdt "hjir en no" útfierd op it momint dat it hjit, d.w.s. de syngroane oanpak wurket;
  5. it is mooglik om tagong te krijen ta de útfier fan in kommando yn stdout, lykas syn weromkearkoade;
  6. As it kommando net yn it systeem is, wurdt in útsûndering smiten.

Lykas by smart-env is d'r stipe foar Python 2 (hoewol't in bytsje mear offerbloed nedich wie) en gjin stipe foar Python 3.0-3.4.

Biblioteek ûntwikkeling plannen

Jo kinne de bibleteken no brûke: beide wurde pleatst op 'e offisjele PyPI. Boarnen binne beskikber op Github (sjoch hjirûnder).

Beide bibleteken sille wurde ûntwikkele mei rekken hâldend mei feedback sammele fan belangstellenden. En as it lestich kin wêze om mei in ferskaat oan nije funksjes te kommen yn smart-env, dan is d'r yn python-shell perfoarst wat oars te foegjen:

  • stipe foar net-blokkearjende petearen;
  • mooglikheid fan ynteraktive kommunikaasje mei it team (wurkje mei stdin);
  • it tafoegjen fan nije eigenskippen (bygelyks eigendom om útfier fan stderr te ûntfangen);
  • ymplemintaasje fan in map mei beskikbere kommando's (foar gebrûk mei de dir() funksje);
  • en sa fierder.

referinsjes

  1. smart-env bibleteek: Github и PyPI
  2. python-shell bibleteek: Github и PyPI
  3. Telegram kanaal biblioteek updates

UPD 23.02.2020/XNUMX/XNUMX:
* Repositories binne ferpleatst, oerienkommende keppelings binne bywurke
* Ferzje python-shell==1.0.1 wurdt taret foar frijlitting op 29.02.2020/XNUMX/XNUMX. Feroarings omfetsje stipe foar kommando autocomplete en it dir(Shell) kommando, útfierende kommando's mei in ûnjildige Python-identifikaasje, en bug fixes.

Boarne: www.habr.com

Add a comment