Доброго времени суток всем.
На сегодняшний день Python является одним из наиболее используемых языков в сфере создания не только непосредственно программных продуктов, но также обеспечения их инфраструктуры. Вследствие этого многим девопсам, по их воле или против оной, пришлось учить новый язык для последующего использования в качестве дополнения к старым добрым Bash-скриптам. Однако Bash и Python исповедуют различные подходы к написанию кода и имеют определенные особенности, в виду чего портирование Bash-скриптов на «змеиный язык» иногда оказывается ёмкой и далеко не тривиальной задачей.
Чтобы упростить жизнь девопсам, создано и продолжает создаваться много полезных библиотек и утилит на Python. Данная статья описывает сразу две новых библиотеки, созданные автором сего поста — dhe — и призванные избавить девопса от необходимости уделять много внимания тонкостям работы с Python, оставляя простор для более интересных задач. Сфера деятельности библиотек — переменные окружения и запуск внешних утилит.
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
