Стварање пријатељства између Питхон-а и Басх-а: смарт-енв и питхон-схелл библиотеке

Добар дан свима.

Данас је Питхон један од најчешће коришћених језика у области креирања не само софтверских производа, већ и обезбеђивања њихове инфраструктуре. Као резултат тога, многи девопи, било својом вољом или против ње, морали су да науче нови језик за каснију употребу као допуну добрим старим Басх скриптама. Међутим, Басх и Питхон исповедају различите приступе писању кода и имају одређене карактеристике, што значи да се преношење Басх скрипти на „змијски језик“ понекад покаже као обимни и далеко од тривијалног задатка.

Да би се олакшао живот девопс-у, створене су и настављају да се креирају многе корисне библиотеке и услужни програми у Питхон-у. Овај чланак описује две нове библиотеке које је креирао аутор овог поста - смарт-енв и питхон-схелл - и дизајниран да ослободи девопс од потребе да се посвети много пажње замршеностима рада са Питхон-ом, остављајући простор за занимљивије задатке. Опсег активности библиотека су варијабле окружења и покретање екстерних услужних програма.

Ко је заинтересован нека види мачку.

Нови "бицикли"?

Чини се, зашто креирати нове пакете за прилично обичне операције? Шта вас спречава да директно користите ос.енвирон и субпроцесс.<метод или класа по вашем избору>?

Даћу доказе у корист сваке од библиотека посебно.

смарт-енв библиотека

Пре него што напишете сопствену идеју, корисно је отићи на интернет и потражити готова решења. Наравно, постоји ризик да не пронађете оно што вам је потребно, али ово је пре „догађај осигурања“. По правилу, овај приступ функционише и штеди много времена и труда.

Према резултатима Претрага откривено је следеће:

  • постоје пакети који заправо омотавају позиве у ос.енвирон, али у исто време захтевају гомилу радњи које ометају (креирање инстанце класе, специјални параметри у позивима, итд.);
  • Постоје добри пакети, који су, међутим, стриктно везани за одређени екосистем (углавном веб оквири као што је Дјанго) и стога уопште нису универзални без датотеке;
  • ретки су покушаји да се уради нешто ново. На пример, додати куцање и експлицитно анализирајте вредности променљивих позивањем метода као што су
    get_<typename>(var_name)

    Или овде још једно решење, који, међутим, не подржава сада осрамоћени Питхон 2 (који, упркос званични РИП, још увек постоје планине писаног кода и читави екосистеми);

  • постоје занати школа-ученици који су, из неког непознатог разлога, завршили у узводном ПиПИ-ју и само стварају проблеме са именовањем нових пакета (посебно, назив „смарт-енв“ је неопходна мера).

И ова листа се може наставити још дуго. Међутим, горе наведене тачке су биле довољне да ме узбуди идеја да направим нешто згодно и универзално.

Захтеви који су постављени пре писања смарт-енв:

  • Најједноставнија шема употребе
  • Подршка за куцање података која се лако конфигурише
  • Компатибилан са Питхон 2.7
  • Добра покривеност кода тестовима

На крају, све се то и реализовало. Ево примера употребе:

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

Као што видите из примера, да бисте радили са новом класом, потребно је само да је увезете (не морате да креирате инстанцу - минус додатну радњу). Приступ било којој променљивој окружења се постиже тако што се она назива променљивом класе ЕНВ, што, у ствари, чини ову класу интуитивним омотачем за природно окружење система, док је истовремено претвара у могући објекат конфигурације за скоро сваки систем ( сличан приступ се, на пример, постиже у Дјангу, само што је тамо конфигурациони објекат сам модул/пакет подешавања).

Омогућавање/онемогућавање режима подршке за аутоматско куцање постиже се помоћу две методе – енабле_аутоматиц_типе_цаст() и дисабле_аутоматиц_типе_цаст(). Ово може бити згодно ако променљива окружења садржи серијализован објекат сличан ЈСОН-у или чак само Булову константу (експлицитно постављање променљиве ДЕБУГ у Дјангу упоређивањем променљиве окружења са „исправним“ стринговима је један од најчешћих случајева). Али сада нема потребе за експлицитним претварањем стрингова - већина потребних радњи је већ уграђена у дубину библиотеке и само чека сигнал да делује. 🙂 Генерално, куцање ради транспарентно и подржава скоро све доступне уграђене типове података (замрзнути скуп, сложени и бајтови нису тестирани).

Захтјев да се подржи Питхон 2 имплементиран је без икаквих жртава (напуштање куцања и неке од „шећерних бомбона“ најновијих верзија Питхон-а 3), посебно захваљујући свеприсутној шесторици (за рјешавање проблема кориштења метакласа ).

Али постоје нека ограничења:

  • Подршка за Питхон 3 значи верзију 3.5 и новију (њихово присуство у вашем пројекту је резултат или лењости или недостатка потребе за побољшањима, пошто је тешко доћи до објективног разлога зашто сте још увек на 3.4);
  • У Питхон 2.7, библиотека не подржава десериализацију скупова литерала. Опис овде. Али ако неко жели да то примени, добродошао је :);

Библиотека такође има механизам изузетака у случају грешака при рашчлањивању. Ако ни један од доступних анализатора не може да препозна стринг, вредност остаје стринг (радије, из разлога погодности и компатибилности уназад са уобичајеном логиком рада променљивих у Басх-у).

питхон-схелл библиотека

Сада ћу вам рећи о другој библиотеци (изоставићу опис недостатака постојећих аналога - слична је оној описаној за смарт-енв. Аналоги - овде и овде).

Генерално, идеја имплементације и захтеви за њу су слични онима описаним за смарт-енв, као што се може видети из примера:

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

Идеја је следећа:

  1. Једна класа која представља Басх у свету Питхон-а;
  2. Свака Басх команда се позива као функција класе Схелл;
  3. Параметри за сваки позив функције се затим прослеђују у одговарајући позив команде Басх;
  4. Свака команда се извршава „овде и сада“ у тренутку када је позвана, тј. синхрони приступ функционише;
  5. могуће је приступити излазу команде у стдоут-у, као и њеном повратном коду;
  6. Ако команда није у систему, избацује се изузетак.

Као и код смарт-енв-а, постоји подршка за Питхон 2 (иако је било потребно мало више жртвене крви) и нема подршке за Питхон 3.0-3.4.

Планови развоја библиотеке

Сада можете да користите библиотеке: обе су објављене на званичном ПиПИ-ју. Извори су доступни на Гитхуб-у (погледајте доле).

Обе библиотеке ће се развијати узимајући у обзир повратне информације прикупљене од заинтересованих. И, ако је можда тешко смислити низ нових функција у смарт-енв, онда у питхон-схелл-у дефинитивно треба додати још нешто:

  • подршка за неблокирајуће позиве;
  • могућност интерактивне комуникације са тимом (рад са стдин);
  • додавање нових својстава (на пример, својства за примање излаза из стдерр-а);
  • имплементација директоријума доступних команди (за употребу са функцијом дир());
  • итд

референце

  1. смарт-енв библиотека: Гитхуб и ПиПИ
  2. питхон-схелл библиотека: Гитхуб и ПиПИ
  3. Телеграм канал ажурирања библиотеке

УПД 23.02.2020:
* Репозиторијуми су премештени, одговарајући линкови су ажурирани
* Верзија питхон-схелл==1.0.1 се припрема за издавање 29.02.2020. Промене укључују подршку за аутодовршавање команде и команду дир(Схелл), покретање команди са неважећим Питхон идентификатором и исправке грешака.

Извор: ввв.хабр.цом

Додај коментар