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:

  • L-aktar skema ta 'użu sempliċi
  • Appoġġ għall-ittajpjar tad-dejta faċilment konfigurabbli
  • Python 2.7 kompatibbli
  • Kopertura tajba tal-kodiċi permezz tat-testijiet

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:

  1. Klassi waħda li tirrappreżenta Bash fid-dinja Python;
  2. Kull kmand Bash jissejjaħ bħala funzjoni tal-klassi Shell;
  3. Il-parametri għal kull sejħa tal-funzjoni mbagħad jiġu mgħoddija fis-sejħa tal-kmand Bash korrispondenti;
  4. Kull kmand jiġi esegwit "hawn u issa" fil-mument li jissejjaħ, i.e. l-approċċ sinkroniku jaħdem;
  5. huwa possibbli li wieħed jaċċessa l-output ta 'kmand fi stdout, kif ukoll il-kodiċi tar-ritorn tiegħu;
  6. 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());
  • eċċ

referenzi

  1. librerija smart-env: GitHub и PyPI
  2. librerija python-shell: GitHub и PyPI
  3. Kanal tat-telegramma aġġornamenti tal-librerija

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.

Sors: www.habr.com

Żid kumment