Эҷоди дӯстии Python ва Bash: китобхонаҳои smart-env ва python-shell

Рӯзи хуб, ҳама.

Имрӯз, Python яке аз забонҳои маъмултарин дар соҳаи эҷоди на танҳо маҳсулоти нармафзор, балки таъмини инфрасохтори онҳо мебошад. Дар натиҷа, бисёре аз девопҳо, хоҳ бо хоҳиши худ ё бар хилофи он, маҷбур шуданд, ки забони навро омӯзанд, то баъдтар ҳамчун илова ба скриптҳои хуби Башш истифода шаванд. Аммо, Bash ва Python равишҳои гуногунро дар навиштани код эътироф мекунанд ва дорои хусусиятҳои муайян мебошанд, яъне интиқоли скриптҳои Bash ба "забони мор" баъзан як кори пурқувват ва дур аз кори ночиз мегардад.

Барои осон кардани ҳаёт барои девопҳо, дар Python бисёр китобхонаҳо ва хидматҳои муфид сохта шудаанд ва эҷод мешаванд. Ин мақола ду китобхонаи наверо тавсиф мекунад, ки муаллифи ин мақола эҷод кардааст - smart-env и питон-ниҳонӣ - ва барои он тарҳрезӣ шудааст, ки девопҳоро аз зарурати таваҷҷӯҳи зиёд ба нозукиҳои кор бо Python раҳо карда, ҷойро барои вазифаҳои ҷолибтар тарк кунанд. Доираи фаъолияти китобхонаҳо тағйирёбандаҳои муҳити зист ва ба кор андохтани утилитҳои беруна мебошад.

Ҳар касе, ки таваҷҷӯҳ дорад, лутфан гурбаро бубинед.

"Велосипедҳои" нав?

Чунин ба назар мерасад, ки чаро бастаҳои навро барои амалиёти оддии оддӣ эҷод кардан лозим аст? Чӣ шуморо аз истифодаи os.environ ва subprocess.<метод ё синфи интихобкардаи шумо> мустақиман бозмедорад?

Ман ба фоидаи ҳар як китобхона дар алоҳидагӣ далелҳо пешниҳод мекунам.

китобхонаи smart-env

Пеш аз навиштани идеяи шахсии худ, ба интернет даромадан ва ҷустуҷӯи роҳҳои омодашуда муфид аст. Албатта, хавфи пайдо накардани он чизе, ки ба шумо лозим аст, вуҷуд дорад, аммо ин "ҳодисаи суғурта" аст. Чун қоида, ин усул кор мекунад ва вақти зиёд ва кӯшишро сарфа мекунад.

Аз рӯи натиҷаҳо ҷустуҷӯ зерин маълум гардид:

  • бастаҳое вуҷуд доранд, ки воқеан зангҳоро ба os.environ мепӯшонанд, аммо дар айни замон як қатор амалҳои парешонкунандаро талаб мекунанд (эҷоди мисоли синф, параметрҳои махсус дар зангҳо ва ғайра);
  • Бастаҳои хуб мавҷуданд, аммо онҳо ба таври қатъӣ ба экосистемаи мушаххас алоқаманданд (асосан чаҳорчӯбаҳои веб ба монанди Django) ва аз ин рӯ бидуни файл умуман универсалӣ нестанд;
  • кушишхои нав ба чо овар-дан кам дида мешаванд. Барои намуна, навиштан илова кунед ва ба таври возеҳ арзишҳои тағирёбандаро тавассути даъват кардани усулҳо ба монанди
    get_<typename>(var_name)

    Ё дар ин ҷо боз як ҳалли дигар, ки бо вуҷуди ин, Python 2-и ҳоло расвошударо дастгирӣ намекунад (бо вуҷуди он RIP расмӣ, ҳанӯз кӯҳҳои рамзи навишташуда ва тамоми экосистема вуҷуд доранд);

  • Ҳунарҳои мактабӣ-донишҷӯён ҳастанд, ки бо сабабҳои номаълум дар болооби PyPI анҷом ёфтанд ва танҳо бо номгузории бастаҳои нав мушкилот эҷод мекунанд (аз ҷумла, номи “smart-env” тадбири зарурӣ аст).

Ва ин рӯйхат метавонад барои муддати тӯлонӣ идома ёбад. Аммо, нуктаҳои дар боло зикршуда кофӣ буданд, ки маро дар бораи идеяи сохтани чизи қулай ва универсалӣ ба ҳаяҷон оваранд.

Талаботе, ки пеш аз навиштани smart-env муқаррар карда шудаанд:

  • Схемаи оддитарини истифода
  • Дастгирии чопкунии маълумотро ба осонӣ танзимшаванда
  • Python 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

Тавре ки шумо аз мисол мебинед, барои кор бо синфи нав, шумо танҳо онро ворид кардан лозим аст (ба шумо лозим нест, ки намуна эҷод кунед - бо назардошти амали иловагӣ). Дастрасӣ ба ҳама гуна тағирёбандаи муҳити зист тавассути истинод ба он ҳамчун тағирёбандаи синфи ENV ба даст оварда мешавад, ки дар асл, ин синфро як бастаи интуитивӣ барои муҳити системаи ватанӣ месозад ва ҳамзамон онро ба объекти конфигуратсияи эҳтимолии қариб ҳама системаҳо табдил медиҳад ( равиши шабеҳ, масалан, дар Django ба даст оварда мешавад, танҳо дар он ҷо объекти конфигуратсия худи модул/бастаи танзимот аст).

Фаъолсозӣ/хомӯш кардани ҳолати дастгирии чопкунии автоматӣ бо истифода аз ду усул - enable_automatic_type_cast () ва disable_automatic_type_cast () амалӣ карда мешавад. Ин метавонад қулай бошад, агар тағирёбандаи муҳити зист дорои объекти сериалшудаи ба JSON монанд ё ҳатто константи мантиқӣ бошад (воқеан муқаррар кардани тағирёбандаи DEBUG дар Django тавассути муқоисаи тағирёбандаи муҳити зист бо сатрҳои "эътибор" яке аз ҳолатҳои маъмултарин аст). Аммо ҳоло ба таври возеҳ табдил додани сатрҳо лозим нест - аксарияти амалҳои зарурӣ аллакай дар умқи китобхона ҷойгир карда шудаанд ва танҳо интизори амал кардани сигнал мебошанд. 🙂 Умуман, чопкунӣ шаффоф кор мекунад ва қариб ҳамаи намудҳои додаҳои дарунсохтро дастгирӣ мекунад (frozenset, мураккаб ва байтҳо санҷида нашудаанд).

Талабот оид ба дастгирии Python 2 амалан бе ягон қурбонӣ (партофтан аз чопкунӣ ва баъзе аз “конфетҳои қанд”-и версияҳои охирини Python 3), аз ҷумла ба шарофати шашгонаи ҳама ҷо (барои ҳалли мушкилоти истифодаи метаклассҳо) амалӣ карда шуд. ).

Аммо баъзе маҳдудиятҳо вуҷуд доранд:

  • Дастгирии Python 3 маънои версияи 3.5 ва болотарро дорад (мавҷудияти онҳо дар лоиҳаи шумо натиҷаи ё танбалӣ ё набудани эҳтиёҷ ба такмил аст, зеро пайдо кардани сабаби объективии чаро шумо то ҳол дар 3.4 ҳастед);
  • Дар Python 2.7, китобхона бесериализатсияи литералҳои муқарраршударо дастгирӣ намекунад. Тавсифи дар ин ҷо. Аммо агар касе мехоҳад онро амалӣ созад, хуш омадед :);

Дар китобхона инчунин механизми истисноӣ дар сурати хатогиҳои таҳлил мавҷуд аст. Агар сатр аз ҷониби ягон таҳлилгари дастрас эътироф карда нашавад, арзиш сатр боқӣ мемонад (баръакс, бо сабабҳои роҳат ва мутобиқати ақиб бо мантиқи муқаррарии кор кардани тағирёбандаҳо дар Bash).

китобхонаи python-shell

Ҳоло ман ба шумо дар бораи китобхонаи дуюм нақл мекунам (ман тавсифи камбудиҳои аналогҳои мавҷударо сарфи назар мекунам - он ба он монанд аст, ки барои smart-env тавсиф шудааст. Аналогҳо - дар ин ҷо и дар ин ҷо).

Умуман, идеяи татбиқ ва талабот ба он ба онҳое, ки барои smart-env тавсиф шудаанд, монанданд, ки аз мисол дида мешавад:

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. Синфи ягона, ки Bash-ро дар ҷаҳони Python муаррифӣ мекунад;
  2. Ҳар як фармони Bash ҳамчун вазифаи синфи Shell номида мешавад;
  3. Параметрҳои ҳар як занги функсия пас аз он ба занги фармони мувофиқи Bash интиқол дода мешаванд;
  4. Ҳар як фармон "дар ин ҷо ва ҳоло" дар лаҳзаи даъватшуда иҷро карда мешавад, яъне. равиши синхронӣ кор мекунад;
  5. ба баромади фармон дар stdout, инчунин рамзи бозгашти он дастрас шудан мумкин аст;
  6. Агар фармон дар система набошад, истисно партофта мешавад.

Мисли smart-env, дастгирии Python 2 вуҷуд дорад (гарчанде ки хуни қурбонии каме бештар лозим буд) ва ҳеҷ гуна дастгирӣ барои Python 3.0-3.4.

Нақшаҳои рушди китобхона

Шумо метавонед ҳоло китобхонаҳоро истифода баред: ҳарду дар PyPI расмии ҷойгир карда шудаанд. Сарчашмаҳо дар Github дастрасанд (ба поён нигаред).

Ҳарду китобхона бо дарназардошти фикру мулоҳизаҳои шахсони манфиатдор таҳия карда мешаванд. Ва, агар пайдо кардани як қатор хусусиятҳои нав дар smart-env душвор бошад, пас дар python-shell бешубҳа чизи дигаре барои илова кардан вуҷуд дорад:

  • дастгирии зангҳои манънашаванда;
  • имконияти муоширати интерактивӣ бо даста (кор бо stdin);
  • илова кардани хосиятҳои нав (масалан, моликият барои гирифтани натиҷа аз stderr);
  • амалисозии феҳристи фармонҳои дастрас (барои истифода бо функсияи dir());
  • ва ғайра.

мурожиат

  1. китобхонаи smart-env: Github и PyPI
  2. китобхонаи python-shell: Github и PyPI
  3. Канали Телеграм навсозиҳои китобхона

UPD 23.02.2020/XNUMX/XNUMX:
* Анборҳо кӯчонида шуданд, истинодҳои мувофиқ нав карда шуданд
* Версияи python-shell==1.0.1 барои нашр 29.02.2020/XNUMX/XNUMX омода карда мешавад. Тағйирот аз дастгирии автоматии фармон ва фармони dir(Shell), иҷро кардани фармонҳо бо идентификатори нодурусти Python ва ислоҳи хатогиҳо иборатанд.

Манбаъ: will.com

Илова Эзоҳ