Nagħmlu Python u Bash Ħbiberija: libreriji smart-env u python-shell
Il-ġurnata t-tajba lil kulħadd.
Illum, Python hija waħda mill-lingwi l-aktar użati fil-qasam tal-ħolqien mhux biss tal-prodotti tas-softwer innifsu, iżda wkoll tal-provvista tal-infrastruttura tagħhom. Bħala riżultat, ħafna devops, bir-rieda tagħhom stess jew kontriha, kellhom jitgħallmu lingwa ġdida għal użu aktar tard bħala suppliment għall-iskripts Bash qodma tajbin. Madankollu, Bash u Python jistqarru approċċi differenti għall-kitba tal-kodiċi u għandhom ċerti karatteristiċi, li jfisser li l-porting tal-iskripts Bash għal "lingwa tas-serp" kultant jirriżulta li jkun kompitu kapaċi u 'l bogħod mill-trivjali.
Biex tagħmel il-ħajja aktar faċli għad-devops, inħolqu ħafna libreriji u utilitajiet utli f'Python u għadhom jinħolqu. Dan l-artikolu jiddeskrivi żewġ libreriji ġodda maħluqa mill-awtur ta 'din il-post - smart-env и python-qoxra - u mfassla biex ittaffi d-devops mill-ħtieġa li tingħata ħafna attenzjoni lill-intricacies tal-ħidma ma 'Python, u tħalli spazju għal kompiti aktar interessanti. L-ambitu ta 'attività tal-libreriji huwa varjabbli ambjentali u tnedija ta' utilitajiet esterni.
Kull min hu interessat, jekk jogħġbok ara cat.
"Roti" ġodda?
Jidher, għaliex jinħolqu pakketti ġodda għal operazzjonijiet pjuttost ordinarji? X'jipprevjenik milli tuża os.environ u subprocess.<metodu jew klassi tal-għażla tiegħek> direttament?
Se nipprovdi evidenza favur kull waħda mil-libreriji separatament.
librerija smart-env
Qabel ma tikteb l-idea tiegħek, huwa utli li tmur online u tfittex soluzzjonijiet lesti. Naturalment, hemm riskju li ma ssibx dak li għandek bżonn, iżda dan huwa pjuttost "avveniment tal-assigurazzjoni". Bħala regola, dan l-approċċ jaħdem u jiffranka ħafna ħin u sforz.
Skond ir-riżultati tfittxija ġie żvelat dan li ġej:
hemm pakketti li fil-fatt wrap sejħiet għal os.environ, iżda fl-istess ħin jeħtieġu mazz ta 'azzjonijiet ta' distrazzjoni (ħolqien ta 'istanza ta' klassi, parametri speċjali fis-sejħiet, eċċ.);
Hemm pakketti tajbin, li, madankollu, huma strettament marbuta ma 'ekosistema speċifika (prinċipalment oqfsa tal-web bħal Django) u għalhekk m'huma xejn universali mingħajr fajl;
hemm tentattivi rari biex tagħmel xi ħaġa ġdida. Pereżempju, żid ittajpjar u parse espliċitament valuri varjabbli billi ssejjaħ metodi bħal
get_<typename>(var_name)
Jew hawn soluzzjoni oħra, li, madankollu, ma jappoġġjax il-Python 2 issa disgraziat (li, minkejja RIP uffiċjali, għad hemm muntanji ta’ kodiċi bil-miktub u ekosistemi sħaħ);
Hemm snajja 'l-istudenti tal-iskola li, għal xi raġuni mhux magħrufa, spiċċaw fil-PyPI upstream u joħolqu biss problemi bl-ismijiet ta' pakketti ġodda (b'mod partikolari, l-isem "smart-env" huwa miżura meħtieġa).
U din il-lista tista 'tkompli għal żmien twil. Madankollu, il-punti ta 'hawn fuq kienu biżżejjed biex iġibni eċċitati dwar l-idea li nagħmel xi ħaġa konvenjenti u universali.
Rekwiżiti li ġew stabbiliti qabel ma nikteb smart-env:
Fl-aħħar mill-aħħar, dan kollu ġie realizzat. Hawn eżempju ta 'użu:
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
Kif tistgħu taraw mill-eżempju, biex taħdem ma 'klassi ġdida, għandek bżonn biss li timportaha (m'għandekx bżonn toħloq istanza - nieqes l-azzjoni żejda). L-aċċess għal kwalunkwe varjabbli ambjentali jinkiseb billi ssir referenza għaliha bħala varjabbli tal-klassi ENV, li, fil-fatt, tagħmel din il-klassi tgeżwir intuwittiv għall-ambjent tas-sistema nattiva, filwaqt li fl-istess ħin tinbidel f'oġġett ta' konfigurazzjoni possibbli għal kważi kull sistema ( approċċ simili, pereżempju, jinkiseb f'Django , hemm biss l-oġġett tal-konfigurazzjoni huwa l-modulu/pakkett tas-settings innifsu).
L-attivazzjoni/diżattivazzjoni tal-mod ta 'appoġġ tat-tajpjar awtomatiku tinkiseb permezz ta' żewġ metodi - enable_automatic_type_cast() u disable_automatic_type_cast(). Dan jista 'jkun konvenjenti jekk il-varjabbli ta' l-ambjent ikun fih oġġett serializzat bħal JSON jew saħansitra kostanti Boolean (issettjar espliċitament tal-varjabbli DEBUG f'Django billi tqabbel il-varjabbli ta 'l-ambjent ma' kordi "validi" huwa wieħed mill-aktar każijiet komuni). Imma issa m'hemmx bżonn li jiġu kkonvertiti b'mod espliċitu kordi - ħafna mill-azzjonijiet meħtieġa huma diġà inkorporati fil-fond tal-librerija u qed jistennew biss sinjal biex jaġixxu. 🙂 B'mod ġenerali, it-tajpjar jaħdem b'mod trasparenti u jappoġġja kważi t-tipi kollha ta' data inkorporati disponibbli (frozenset, kumpless u bytes ma ġewx ittestjati).
Ir-rekwiżit għall-appoġġ ta 'Python 2 ġie implimentat prattikament mingħajr sagrifiċċji (li jċedu t-tajping u xi wħud mill-"ħelu taz-zokkor" tal-aħħar verżjonijiet ta' Python 3), b'mod partikolari grazzi għas-sitta kullimkien (biex issolvi l-problemi tal-użu tal-metaklassijiet).
Iżda hemm xi restrizzjonijiet:
L-appoġġ għal Python 3 ifisser verżjoni 3.5 u ogħla (il-preżenza tagħhom fil-proġett tiegħek hija r-riżultat jew ta 'għażż jew nuqqas ta' ħtieġa għal titjib, peress li huwa diffiċli li toħroġ b'raġuni oġġettiva għaliex għadek fuq 3.4);
F'Python 2.7, il-librerija ma tappoġġjax deserialization ta 'sett letterali. Deskrizzjoni hawn. Imma jekk xi ħadd irid jimplimentaha, int mistieden :);
Il-librerija għandha wkoll mekkaniżmu ta 'eċċezzjoni f'każ ta' żbalji ta 'parsing. Jekk is-sekwenza ma setgħetx tiġi rikonoxxuta minn xi wieħed mill-analizzaturi disponibbli, il-valur jibqa 'sekwenza (pjuttost, għal raġunijiet ta' konvenjenza u kompatibilità b'lura mal-loġika tas-soltu ta 'kif jaħdmu l-varjabbli f'Bash).
librerija python-shell
Issa ngħidlek dwar it-tieni librerija (nħalli barra d-deskrizzjoni tan-nuqqasijiet tal-analogi eżistenti - hija simili għal dik deskritta għal smart-env. Analogi - hawn и hawn).
B'mod ġenerali, l-idea ta 'implimentazzjoni u r-rekwiżiti għaliha huma simili għal dawk deskritti għal smart-env, kif jidher mill-eżempju:
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
L-idea hija din:
Klassi waħda li tirrappreżenta Bash fid-dinja Python;
Kull kmand Bash jissejjaħ bħala funzjoni tal-klassi Shell;
Il-parametri għal kull sejħa tal-funzjoni mbagħad jiġu mgħoddija fis-sejħa tal-kmand Bash korrispondenti;
Kull kmand jiġi esegwit "hawn u issa" fil-mument li jissejjaħ, i.e. l-approċċ sinkroniku jaħdem;
huwa possibbli li wieħed jaċċessa l-output ta 'kmand fi stdout, kif ukoll il-kodiċi tar-ritorn tiegħu;
Jekk il-kmand ma jkunx fis-sistema, tintefa' eċċezzjoni.
Bħal smart-env, hemm appoġġ għal Python 2 (għalkemm kien meħtieġ ftit aktar demm ta 'sagrifiċċju) u l-ebda appoġġ għal Python 3.0-3.4.
Pjanijiet ta' żvilupp tal-libreriji
Tista' tuża l-libreriji issa: it-tnejn huma stazzjonati fuq il-PyPI uffiċjali. Is-sorsi huma disponibbli fuq Github (ara hawn taħt).
Iż-żewġ libreriji se jiġu żviluppati b'kont meħud tal-feedback miġbur minn dawk interessati. U, jekk jista 'jkun diffiċli li toħroġ b'varjetà ta' karatteristiċi ġodda f'smart-env, allura f'python-shell definittivament hemm xi ħaġa oħra x'iżżid:
appoġġ għal sejħiet li ma jimblukkawx;
possibbiltà ta 'komunikazzjoni interattiva mat-tim (ħidma ma' stdin);
iżżid proprjetajiet ġodda (per eżempju, proprjetà biex tirċievi output minn stderr);
implimentazzjoni ta 'direttorju ta' kmandi disponibbli (għall-użu mal-funzjoni dir());
UPD 23.02.2020/XNUMX/XNUMX:
* Repożitorji ġew imċaqalqa, links korrispondenti ġew aġġornati
* Il-verżjoni python-shell==1.0.1 qed titħejja għar-rilaxx fid-29.02.2020/XNUMX/XNUMX. Il-bidliet jinkludu appoġġ għall-kmand awtokompletat u l-kmand dir(Shell), tmexxija ta 'kmandi b'identifikatur Python invalidu, u bug fixes.