Duke bashkuar Python dhe Bash: bibliotekat smart-env dhe python-shell

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 — smart-env dhe python-shell — 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 të kërkimit 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, tĂ« shtohet tipizimi dhe tĂ« parse-m vlerat e variablave duke thirrur metoda tĂ« formatit
    get_(var_name)

    Ose ja një zgjidhje tjetër, e cila, megjithatë, nuk mbështet tani të përkëdhelurin Python 2 (në të cilin, pavarësisht nga R.I.P. zyrtare., 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 kĂ«tu. 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 — kĂ«tu dhe kĂ«tu).

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:

  1. Një klasë e vetme që personifikon Bash në botën e Python;
  2. Çdo komandĂ« Bash thirret si njĂ« funksion i klasĂ«s Shell;
  3. Parametrat e thirrjes së çdo funksioni kalohen më pas në thirrjen e komandës përkatëse Bash;
  4. Çdo komandĂ« ekzekutohet "kĂ«tu dhe tani" nĂ« momentin e thirrjes sĂ« saj, pra funksionon njĂ« afrim sinkron;
  5. ka mundësinë për të aksesuar daljen e komandës në stdout, si dhe kodin e kthimit të saj;
  6. 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

  1. Biblioteka smart-env: Github dhe PyPI
  2. Biblioteka python-shell: Github dhe PyPI
  3. Kanal Telegrami 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

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster