Mirëdita të gjithëve.
Sot, Python është një nga gjuhët më të përdorura në fushën e krijimit të produkteve programore, por edhe të sigurisë së infrastrukturës së tyre. Si pasojë, shumë DevOps-a, për shkak të dëshirës së tyre ose jo, u desh të mësojnë një gjuhë të re për ta përdorur si një shtesë ndaj skenarëve të njohur të Bash-it. Megjithatë, Bash dhe Python ndjekin qasje të ndryshme për të shkruar kod dhe kanë karakteristika të veçanta, kështu që kalimi i skripteve të Bash në "gjuhën e gjarprit" ndonjëherë është një detyrë e ngarkuar dhe jo fare triviale.
PĂ«r tĂ« lehtĂ«suar jetĂ«n e DevOps-ave, janĂ« krijuar dhe vazhdojnĂ« tĂ« krijohen shumĂ« biblioteka dhe utilita tĂ« dobishme nĂ« Python. Ky artikull pĂ«rshkruan dy biblioteka tĂ« reja, tĂ« krijuara nga autori i kĂ«tij postimi â dhe â dhe janĂ« krijuar pĂ«r t'i liruar DevOps-Ă«t nga nevoja pĂ«r t'i kushtuar shumĂ« vĂ«mendje nuancave tĂ« punĂ«s me Python, duke lĂ«nĂ« hapĂ«sirĂ« pĂ«r detyra mĂ« interesante. Fusha e veprimit tĂ« bibliotekave Ă«shtĂ« variablat e ambientit dhe ekzekutimi i utilitave tĂ« jashtme.
Kush është i interesuar, le të vijë poshtë.
Bicycle të reja?
Duket se, pĂ«rse tĂ« krijojmĂ« paketa tĂ« reja pĂ«r operacione mjaft tĂ« zakonshme? ĂfarĂ« pengon tĂ« pĂ«rdoren drejtpĂ«rdrejt os.environ dhe subprocess.?
Do të jap prova për secilën nga bibliotekat veçmas.
Biblioteka smart-env
Para se të shkruani krijimin tuaj, është e dobishme të hidhni një vështrim në Internet dhe të kërkoni zgjidhje të gatshme. Sigurisht, ekziston rreziku që të mos gjeni atë që ju nevojitet, por kjo, në përgjithësi, është një "rast sigurie". Rregulli zakonisht funksionon dhe kursen shumë kohë dhe mund.
Sipas rezultateve u identifikua si më poshtë:
- ka paketa që, me të vërtetë, mbulojnë thirrjet në os.environ, megjithatë kërkojnë shumë veprime që shpërqendrojnë (krijimi i një instancë klase, parametra të veçantë në thirrje, etj.);
- ka paketa të mira, të cilat, megjithatë, janë të lidhura ngushtë me një ekosistem të caktuar (shtëpasht që zakonisht janë për framework-e të uebit si Django) dhe pra nuk janë universale pa një ndihmë të vogël;
- ka përpjekje të rralla për të bërë diçka të re. Për shembull, dhe të analizojnë në mënyrë të qartë vlerat e variablave duke thirrur metoda si
get_(var_name)Ose ja , e cila, megjithatë, nuk mbështet ende Python 2 të mbetur në harresë (në të cilin, pavarësisht nga , ende janë akoma male të kodit të shkruar dhe të tëra ekosistemat);
- ka projekte shkollore-studentore, për të cilat në përgjithësi nuk është e qartë pse janë gjetur në PyPI upstream dhe thjesht krijojnë probleme me emërtimin e pakove të reja (sidomos, emri 'smart-env' është një masë e detyruar).
Dhe kjo listë mund të vazhdojë për një kohë të gjatë. Megjithatë, pika të mësipërme mjaftojnë për të ndezur idenë për të bërë diçka të përshtatshme dhe universale.
Kërkesat që u vendosën për shkruarjen e smart-env:
- Një skemë përdorimi sa më e thjeshtë
- Lehtësisht e konfiguroheshme mbështetje për tipizimin e të dhënave
- Kompaktibilitet me Python 2.7
- Mbulim i mirë i kodit me teste
Në fund, të gjitha këto arritën të realizohen. Ja një shembull përdorimi:
from smart_env import ENV
print(ENV.HOME) # Baraz print(os.environ['HOME'])
# duke supozuar se keni vendosur variablën e mjedisit MYVAR në "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Baraz boolean True
ENV.NEW_VAR = 100 # Vendos një variabël të re mjedisi
Siç shihet nga shembulli, pĂ«r tĂ« punuar me klasĂ«n e re, mjafton ta importoni (nuk Ă«shtĂ« e nevojshme tĂ« krijoni njĂ« instancĂ« â minus veprimi i panevojshĂ«m). Qasja nĂ« çdo variabĂ«l mjedisi arrihet duke iu referuar asaj si njĂ« variabĂ«l e klasĂ«s ENV, qĂ«, nĂ« fakt, e bĂ«n kĂ«tĂ« klasĂ« njĂ« mbĂ«shtetje intuitivisht pĂ«r ambientin natyror tĂ« sistemit, pĂ«rveçse e shndĂ«rron atĂ« nĂ« njĂ« variant tĂ« mundshĂ«m tĂ« objektit tĂ« konfigurimit pĂ«r pothuajse çdo sistem (njĂ« qasje e ngjashme, pĂ«r shembull, arrin nĂ« Django, vetĂ«m se atje objekti i konfigurimit Ă«shtĂ« nĂ« mĂ«nyrĂ« direkte moduli/paketa settings).
Aktivizimi/deaktivizimi i modit tĂ« mbĂ«shtetjes pĂ«r tipizimin automatik arrihet pĂ«rmes pĂ«rdorimit tĂ« dy metodave â enable_automatic_type_cast() dhe disable_automatic_type_cast(). Kjo mund tĂ« jetĂ« e dobishme, nĂ«se variabla mjedisi mban njĂ« objekt tĂ« serializuar tĂ« ngjashĂ«m me JSON ose madje thjesht njĂ« konstantĂ« boolean (shprehja e qartĂ« e variablĂ«s DEBUG nĂ« Django duke e krahasuar atĂ« me 'tĂ« lejuarat' rreshta â njĂ« nga rastet mĂ« tĂ« zakonshme). Por tani nuk ka nevojĂ« pĂ«r tĂ« konvertuar shprehimisht vargjet â shumica e veprimeve tĂ« nevojshme janĂ« tashmĂ« tĂ« inkorporuara nĂ« thellĂ«sitĂ« e bibliotekĂ«s dhe vetĂ«m presin sinjalin pĂ«r veprim. đ NĂ« pĂ«rgjithĂ«si, tipizimi funksionon nĂ« mĂ«nyrĂ« transparente dhe mbĂ«shtet pothuajse tĂ« gjitha tipet e dhĂ«nave tĂ« ndĂ«rtuara qĂ« ekzistojnĂ« (frozenset, complex dhe bytes nuk janĂ« testuar).
Kërkesa për mbështetje të Python 2 është realizuar praktikisht pa viktima (heqjen e typing dhe disa 'candies' të fundit të versioneve të Python 3), veçanërisht falë gjithanshëmërisë six (për zgjidhjen e problemeve me përdorimin e metaklasave).
Por ka disa kufizime:
- Mbështetje për Python 3 nënkupton versionin 3.5 dhe më lart (prania e tyre në projektin tuaj është rezultat i lenies ose mungesës së nevojës për përmirësime, pasi është e vështirë të imagjinohet një arsye objektive pse ende jeni në 3.4);
- NĂ« Python 2.7 biblioteka nuk mbĂ«shtet deserializimin e literalĂ«ve tĂ« grupeve. PĂ«rshkrimi . Por, nĂ«se dikush dĂ«shiron ta realizojĂ« â mirĂ«priteni:);
Biblioteka gjithashtu ka një mekanizëm për menaxhimin e përjashtimeve në rast gabimesh në analizë. Nëse një varg nuk është njohur nga asnjë nga analizatorët e disponueshëm, vlera mbetet varg (me shumë, nga konsideratat e lehtësisë dhe të kthimit në përputhje me logjikën e zakonshme të punës me variablat në Bash).
Biblioteka python-shell
Tani do tĂ« flas pĂ«r bibliotekĂ«n e dytĂ« (pĂ«rshkrimin e disavantazheve tĂ« analogĂ«ve tĂ« disponueshĂ«m do ta lĂ« pĂ«rjashtuar â Ă«shtĂ« e ngjashme me atĂ« qĂ« pĂ«rshkruhet pĂ«r smart-env. AnalogĂ«t â dhe ).
Në përgjithësi, ideja e realizimit dhe kërkesat e saj janë të ngjashme me ato të përshkruara për smart-env, që duket nga shembulli:
from python_shell import Shell
Shell.ls('-l', '$HOME') # E barabartë me "ls -l $HOME"
command = Shell.whoami() # E barabartë me "whoami"
print(command.output) # printon emrin tuaj të tanishëm të përdoruesit
print(command.command) # printon "whoami"
print(command.return_code) # printon "0"
print(command.arguments) # printon ""
Shell.mkdir('-p', '\/tmp\/new_folder') # krijon një dosje të re
Ideja është kështu:
- Një klasë e vetme, që personifikon Bash në botën e Python;
- Ădo komandĂ« Bash thirret si funksion i klasĂ«s Shell;
- Parametrat e thirrjes së çdo funksioni më pas dërgohen në thirrjen e komandës përkatëse Bash;
- Ădo komandĂ« ekzekutohet 'kĂ«tu dhe tani' nĂ« momentin e thirrjes sĂ« saj, pra funksionon njĂ« qasje sinjronike;
- ka mundësinë për të aksesuar daljen e komandës në stdout, si dhe kodin e saj të kthimit;
- NĂ«se komanda nuk Ă«shtĂ« e pranishme nĂ« sistem â njĂ« pĂ«rjashtim Ă«shtĂ« hedhur.
Si në rastin e smart-env, sigurohet mbështetje për Python 2 (në të vërtetë, është dashur pak më shumë gjak sakrificë) dhe nuk ka mbështetje për Python 3.0-3.4.
Planet për zhvillimin e bibliotekave
Mund të përdoren bibliotekat si tani: të dyja janë publikuar në PyPI zyrtare. Burimet janë të disponueshme në Github (shih më poshtë).
Të dy bibliotekat do të zhvillohen duke marrë parasysh feedback-un e mbledhur nga të interesuarit. Dhe, ndoshta në smart-env është një sfidë për të menduar për diversitetin e karakteristikave të reja, por në python-shell ka ende shumë për të shtuar:
- mbështetje për thirrje jo-bllokuese;
- mundësia për komunikim të ndërveprueshëm me ekipin (puna me stdin);
- shtimi i pronarive të reja (p.sh. pronë për të marrë daljen nga stderr);
- implementimi i një katalogu të komandave të disponueshme (për t'u përdorur me funksionin dir());
- etj.
Linket
- Biblioteka smart-env: dhe
- Biblioteka python-shell: dhe
- aktualizimeve të bibliotekave
UPD 23.02.2020:
* Repo janë trasferuar, lidhjet përkatëse janë përditësuar
* Versioni python-shell==1.0.1 është në përgatitje për t'u lëshuar më 29.02.2020. Ndër ndryshimet: mbështetje për autokcomplete të komandave dhe komandës dir(Shell), ekzekutimi i komandave me identifikues jo të vlefshëm për Python, rregullimi i gabimeve.
Burimi: habr.com
