Mirëdita të gjithëve.
Aktualisht, Python është një nga gjuhët më të përdorura në fushën e krijimit të produkteve programore, si dhe për sigurimin e infrastrukturës së tyre. Si rezultat, shumë devops, në vullnetin e tyre ose jo, ishin të detyruar të mësonin një gjuhë të re për ta përdorur si një shtesë për skriptet e vjetra Bash. Megjithatë, Bash dhe Python ndjekin qasje të ndryshme në shkrimin e kodit dhe kanë disa karakteristika të veçanta, prandaj portimi i skripteve bash në gjuhën 'gjarpër' ndonjëherë rezulton të jetë një detyrë e ngarkuar dhe aspak triviale.
PĂ«r tĂ« lehtĂ«suar jetĂ«n e devops, janĂ« krijuar dhe vazhdojnĂ« tĂ« krijohen shumĂ« biblioteka dhe utilitete tĂ« dobishme nĂ« Python. Ky artikull pĂ«rshkruan dy biblioteka tĂ« reja, tĂ« krijuara nga autori i kĂ«tij postimi â dhe â qĂ« synojnĂ« tĂ« shpĂ«tojnĂ« devops nga nevoja pĂ«r tĂ« 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Ă« ambientet e ndryshme dhe ekzekutimi i utiliteteve tĂ« jashtme.
Kush do të jetë i interesuar, të lutem shiko poshtë.
Bicycle të reja?
Duket si njĂ« pyetje e panevojshme pĂ«rse tĂ« krijojmĂ« paketa tĂ« reja pĂ«r operacione mjaft tĂ« zakonshme? ĂfarĂ« e pengon pĂ«rdorimin e drejtpĂ«rdrejtĂ« tĂ« os.environ dhe subprocess.?
Do të sjell prova për secilën nga bibliotekat veçmas.
Biblioteka smart-env
Para se tĂ« shkruani krijimin tuaj, Ă«shtĂ« e dobishme tĂ« kĂ«rkoni nĂ« Internet pĂ«r zgjidhje tĂ« gatshme. Sigurisht, ka rrezik qĂ« tĂ« mos gjeni atĂ« qĂ« ju nevojitet, por kjo, mĂ« shumĂ«, Ă«shtĂ« njĂ« ârast sigurieâ. Zakonisht, ky qasje funksionon dhe kursen shumĂ« kohĂ« dhe energji.
Sipas rezultateve u zbulua e nasledova:
- ka paketa që vërtet mbështesin thirrjet në os.environ, megjithatë kërkojnë shumë veprime tjetër (krijimi i një instance klase, parametra specialë në thirrje dhe të tjera);
- ka paketa të mira, por që janë të lidhura ngushtë me një ekosistem të caktuar (kryesisht, me framework-e web si Django) dhe ndaj nuk janë aspak universale pa një modifikim;
- ka përpjekje të rralla për të bërë diçka të re. Për shembull, dhe të parse-m vlerat e variablave duke thirrur metoda të formatit
get_(var_name)Ose ja , e cila, megjithatë, nuk mbështet tani të përkëdhelurin Python 2 (në të cilin, pavarësisht nga , akoma mbeten mali i kodit të shkruar dhe tërësitë e tërmetit);
- janĂ« projekte shkollore-studimore, krejtĂ«sisht tĂ« paqartĂ« pse gjenden nĂ« PyPI-nĂ« kryesore dhe vetĂ«m krijojnĂ« probleme me emĂ«rtimin e paketimeve tĂ« reja (nĂ« veçanti, emri «smart-env» â njĂ« masĂ« e detyruar).
Dhe ky listë mund të vazhdojë për një kohë të gjatë. Megjithatë, edhe pikat e përmendura më sipër ishin të mjaftueshme për të ndezur idenë për të bërë diçka të lehtë dhe universale.
Kërkesat që u vendosën për shkrimin e smart-env:
- Schema e përdorimit sa më e thjeshtë
- Mbështetje për tipizimin e të dhënave të lehtë për t'u konfigurueshme
- Kompatibilitet me Python 2.7
- Mbulim i mirë i kodit me teste
Në fund, e gjithë kjo u realizua. Ja një shembull përdorimi:
from smart_env import ENV
print(ENV.HOME) # E barabartë me print(os.environ['HOME'])
# duke supozuar se e vendosni variablin e mjedisit MYVAR në "True"
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # E barabartë me boolean True
ENV.NEW_VAR = 100 # Vendos një variabël të re mjedisore
Si e qartë nga shembulli, për të punuar me klasën e re, mjafton ta importoni (nuk është e nevojshme të krijoni një instancë - një veprim i kotë). Qasja në çdo variabël mjedisi arrihet duke iu referuar asaj si një variabël e klasës ENV, e cila, në fakt, e bën këtë klasë një mbështjellës intuitiv për ambientin natyror të sistemit, duke e bërë atë një mundësi për një objekt konfigurimi në pothuajse çdo sistem (një qasje e ngjashme, për shembull, arrihet në Django, vetëm se aty objekti i konfigurimit është moduli/pakoja settings).
Aktivizimi/fshirja e modalitetit tĂ« mbĂ«shtetjes sĂ« automatik tipizimit arrihet pĂ«rmes dy metodave â enable_automatic_type_cast() dhe disable_automatic_type_cast(). Kjo mund tĂ« jetĂ« e dobishme nĂ«se njĂ« variabĂ«l mjedisor pĂ«rmban njĂ« objekt tĂ« serilizuar si JSON ose madje edhe njĂ« konstant boolean (pĂ«rcaktimi eksplicit i variablit DEBUG nĂ« Django duke e krahasuar variablin mjedisor me stringat "tĂ« lejuara" â njĂ« nga rastet mĂ« tĂ« zakonshme). Por tani nuk ka nevojĂ« tĂ« konvertoni shprehitĂ« me forcĂ« â shumica e veprimeve tĂ« nevojshme tashmĂ« janĂ« tĂ« inkorporuara nĂ« thellĂ«sitĂ« e bibliotekĂ«s dhe presin vetĂ«m sinjalin pĂ«r tĂ« vepruar. đ NĂ« pĂ«rgjithĂ«si, tipizimi funksionon nĂ« mĂ«nyrĂ« transparente dhe mbĂ«shtet pothuajse tĂ« gjitha llojet e integruara tĂ« tĂ« dhĂ«nave (frozenset, complex dhe bytes nuk janĂ« testuar).
Kërkesa për mbështetje për Python 2 u realizua praktikisht pa viktima (heqja dorë nga typing dhe disa "kanellat" e versioneve të fundit të Python 3), përkatësisht falë omniprezentit six (për zgjidhjen e problemeve me përdorimin e metaklasave).
Por ka disa kufizime:
- Mbështetja për Python 3 nënkupton versionin 3.5 dhe më lart (prania e tyre në projektin tuaj është rezultat i lenes ose mungesës së nevojës për përmirësime, pasi është e vështirë të shpikni një arsye objektive pse ende qëndroni në 3.4);
- Në Python 2.7, biblioteka nuk mbështet deserializimin e literalëve të shumësive. Përshkrimi . Por, nëse dikush do të dëshiron x jep nder;);
Biblioteka gjithashtu ndjek mekanizmin e përjashtimeve për rastet e gabimeve në analizë. Nëse një varg nuk mund të njihet nga asnjë nga analizatorët e disponueshëm, vlera mbetet një varg (ndoshta nga komoditeti dhe për të mbajtur kompatibilitetin 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Ă« (do tĂ« anashkalohem tĂ« pĂ«rshkruaj tĂ« metat e analogĂ«ve tĂ« tanishĂ«m â ato ngjajnĂ« me ato tĂ« pĂ«rshkruara pĂ«r smart-env. AnalogĂ«t â dhe ).
Në përgjithësi, ideja e implementimit dhe kërkesat për të janë të ngjashme me ato të përshkruara për smart-env, gjë 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 aktual 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ë folder të ri
Ideja është kështu:
- Një klasë e vetme që personifikon Bash në botën e Python;
- Ădo komandĂ« Bash thirret si njĂ« funksion i klasĂ«s Shell;
- Parametrat e thirrjes së çdo funksioni kalohen më pas 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Ă« afrim sinkron;
- ka mundësinë për të aksesuar daljen e komandës në stdout, si dhe kodin e kthimit të saj;
- NĂ«se komandĂ« nuk ekziston nĂ« sistem â njĂ« pĂ«rjashtim hidhet.
Siç është rasti me smart-env, ofrohet mbështetje për Python 2 (për më shumë është kërkuar pak më shumë 'gjak të sakrifikuar') dhe nuk ka mbështetje për Python 3.0-3.4.
Planet për zhvillimin e bibliotekave
Bibliotekat mund të përdoren tashmë: të dyja janë publikuar në PyPI zyrtare. Burimet janë të disponueshme në Github (shih më poshtë).
Të dyja bibliotekat do të zhvillohen me sjelljen e feedback-ut të mbledhur nga ata që janë të interesuar. Dhe, nëse në smart-env, ndoshta është e vështirë të imagjinosh një shumëllojshmëri të reja veçorish, në python-shell ka ende shumë për të shtuar:
- mbështetje për thirrje jo-bllokuese;
- mundësia për komunikim interaktiv me komandën (punë me stdin);
- shtimi i veçorive të reja (p.sh. pronësi për marrjen e daljes nga stderr);
- implementimi i katalogut të komandave të disponueshme (për t'u përdorur me funksionin dir());
- etj.
Linke
- Biblioteka smart-env: dhe
- Biblioteka python-shell: dhe
- aktualizimet e bibliotekave
UPD 23.02.2020:
* Repozitat janë transferuar, lidhjet përkatëse janë azhurnuar
* Versioni python-shell==1.0.1 është duke u përgatitur për lançim më 29.02.2020. Ndër ndryshimet është mbështetja për auto-complete të komandave dhe komandës dir(Shell), ekzekutimi i komandave me identifikues të pavlefshëm për Python, riparimi i gabimeve.
Burimi: habr.com
