Python-ի և Bash Friendship-ի ստեղծում. smart-env և python-shell գրադարաններ

Բարի օր բոլորին։

Այսօր Python-ը ամենաօգտագործվող լեզուներից մեկն է ոչ միայն ծրագրային ապահովման արտադրանք ստեղծելու, այլև դրանց ենթակառուցվածքի ապահովման ոլորտում: Արդյունքում, շատ դևոպներ, անկախ իրենց կամքով, թե հակառակ, ստիպված էին նոր լեզու սովորել՝ հետագայում օգտագործելու համար որպես լրացում հին լավ Bash գրերի: Այնուամենայնիվ, Bash-ը և Python-ը տարբեր մոտեցումներ ունեն կոդ գրելու հարցում և ունեն որոշակի առանձնահատկություններ, ինչը նշանակում է, որ Bash-ի սկրիպտները «օձի լեզվին» տեղափոխելը երբեմն տարողունակ և աննշան խնդիր է դառնում:

Devops-ի կյանքը հեշտացնելու համար Python-ում ստեղծվել և շարունակում են ստեղծվել բազմաթիվ օգտակար գրադարաններ և կոմունալ ծառայություններ: Այս հոդվածը նկարագրում է այս գրառման հեղինակի կողմից ստեղծված երկու նոր գրադարաններ. smart-env и python-shell - և նախատեսված է Դևոպին ազատելու 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-ի նմանվող օբյեկտ կամ նույնիսկ պարզապես Բուլյան հաստատուն (Django-ում DEBUG փոփոխականի հստակ կարգավորումը՝ շրջակա միջավայրի փոփոխականը «վավեր» տողերի հետ համեմատելով, ամենատարածված դեպքերից մեկն է): Բայց այժմ կարիք չկա հստակորեն փոխակերպել տողերը. անհրաժեշտ գործողությունների մեծ մասն արդեն ներդրված է գրադարանի խորքում և պարզապես սպասում է գործողության ազդանշանի: 🙂 Ընդհանուր առմամբ, մուտքագրումն աշխատում է թափանցիկ և աջակցում է գրեթե բոլոր առկա ներկառուցված տվյալների տեսակները (սառեցված, բարդ և բայթերը չեն փորձարկվել):

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-ում (տես ստորև):

Երկու գրադարաններն էլ կմշակվեն՝ հաշվի առնելով հետաքրքրվողներից հավաքված կարծիքները: Եվ, եթե սմարթ-env-ում մի շարք նոր հնարավորություններ ստեղծելը կարող է դժվար լինել, ապա python-shell-ում հաստատ այլ բան կա ավելացնելու.

  • աջակցություն չարգելափակող զանգերին;
  • թիմի հետ ինտերակտիվ հաղորդակցության հնարավորություն (աշխատանք stdin-ի հետ);
  • ավելացնելով նոր հատկություններ (օրինակ՝ stderr-ից ելք ստանալու հատկություն);
  • հասանելի հրամանների գրացուցակի իրականացում (dir() ֆունկցիայի հետ օգտագործելու համար);
  • եւ այլն:

Սայլակ

  1. smart-env գրադարան. Github и ՊԻՊԻ
  2. python-shell գրադարան. Github и ՊԻՊԻ
  3. Telegram ալիք գրադարանի թարմացումներ

UPD 23.02.2020/XNUMX/XNUMX:
* Պահեստները տեղափոխվել են, համապատասխան հղումները թարմացվել են
* Python-shell==1.0.1 տարբերակը պատրաստվում է թողարկման 29.02.2020/XNUMX/XNUMX թ.։ Փոփոխությունները ներառում են հրամանի ավտոմատ լրացման և dir(Shell) հրամանի աջակցություն, Python-ի անվավեր նույնացուցիչով հրամանների գործարկում և սխալների շտկում:

Source: www.habr.com

Добавить комментарий