Po i lidhim Python dhe Bash: bibliotekat smart-env dhe python-shell

Mirëdita të gjithëve.

Sot, Python është një nga gjuhët më të përdorura në fushën e krijimit të produkteve programore, por edhe të sigurisë së infrastrukturës së tyre. Si pasojë, shumë DevOps-a, për shkak të dëshirës së tyre ose jo, u desh të mësojnë një gjuhë të re për ta përdorur si një shtesë ndaj skenarëve të njohur të Bash-it. Megjithatë, Bash dhe Python ndjekin qasje të ndryshme për të shkruar kod dhe kanë karakteristika të veçanta, kështu që kalimi i skripteve të Bash në "gjuhën e gjarprit" ndonjëherë është një detyrë e ngarkuar dhe jo fare triviale.

PĂ«r tĂ« lehtĂ«suar jetĂ«n e DevOps-ave, janĂ« krijuar dhe vazhdojnĂ« tĂ« krijohen shumĂ« biblioteka dhe utilita 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 — dhe janĂ« krijuar pĂ«r t'i liruar DevOps-Ă«t nga nevoja pĂ«r t'i 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Ă« variablat e ambientit dhe ekzekutimi i utilitave tĂ« jashtme.

Kush është i interesuar, le të vijë poshtë.

Bicycle të reja?

Duket se, pĂ«rse tĂ« krijojmĂ« paketa tĂ« reja pĂ«r operacione mjaft tĂ« zakonshme? ÇfarĂ« pengon tĂ« pĂ«rdoren drejtpĂ«rdrejt os.environ dhe subprocess.?

Do të jap prova për secilën nga bibliotekat veçmas.

Biblioteka smart-env

Para se të shkruani krijimin tuaj, është e dobishme të hidhni një vështrim në Internet dhe të kërkoni zgjidhje të gatshme. Sigurisht, ekziston rreziku që të mos gjeni atë që ju nevojitet, por kjo, në përgjithësi, është një "rast sigurie". Rregulli zakonisht funksionon dhe kursen shumë kohë dhe mund.

Sipas rezultateve në kërkim u identifikua si më poshtë:

  • ka paketa qĂ«, me tĂ« vĂ«rtetĂ«, mbulojnĂ« thirrjet nĂ« os.environ, megjithatĂ« kĂ«rkojnĂ« shumĂ« veprime qĂ« shpĂ«rqendrojnĂ« (krijimi i njĂ« instancĂ« klase, parametra tĂ« veçantĂ« nĂ« thirrje, etj.);
  • ka paketa tĂ« mira, tĂ« cilat, megjithatĂ«, janĂ« tĂ« lidhura ngushtĂ« me njĂ« ekosistem tĂ« caktuar (shtĂ«pasht qĂ« zakonisht janĂ« pĂ«r framework-e tĂ« uebit si Django) dhe pra nuk janĂ« universale pa njĂ« ndihmĂ« tĂ« vogĂ«l;
  • ka pĂ«rpjekje tĂ« rralla pĂ«r tĂ« bĂ«rĂ« diçka tĂ« re. PĂ«r shembull, tĂ« shtojnĂ« tipizimin dhe tĂ« analizojnĂ« nĂ« mĂ«nyrĂ« tĂ« qartĂ« vlerat e variablave duke thirrur metoda si
    get_(var_name)

    Ose ja një zgjidhje tjetër, e cila, megjithatë, nuk mbështet ende Python 2 të mbetur në harresë (në të cilin, pavarësisht nga R.I.P. zyrtar., ende janë akoma male të kodit të shkruar dhe të tëra ekosistemat);

  • ka projekte shkollore-studentore, pĂ«r tĂ« cilat nĂ« pĂ«rgjithĂ«si nuk Ă«shtĂ« e qartĂ« pse janĂ« gjetur nĂ« PyPI upstream dhe thjesht krijojnĂ« probleme me emĂ«rtimin e pakove tĂ« reja (sidomos, emri 'smart-env' Ă«shtĂ« njĂ« masĂ« e detyruar).

Dhe kjo listë mund të vazhdojë për një kohë të gjatë. Megjithatë, pika të mësipërme mjaftojnë për të ndezur idenë për të bërë diçka të përshtatshme dhe universale.

Kërkesat që u vendosën për shkruarjen e smart-env:

  • NjĂ« skemĂ« pĂ«rdorimi sa mĂ« e thjeshtĂ«
  • LehtĂ«sisht e konfiguroheshme mbĂ«shtetje pĂ«r tipizimin e tĂ« dhĂ«nave
  • Kompaktibilitet me Python 2.7
  • Mbulim i mirĂ« i kodit me teste

Në fund, të gjitha këto arritën të realizohen. Ja një shembull përdorimi:

from smart_env import ENV

print(ENV.HOME)  # Baraz print(os.environ['HOME'])

# duke supozuar se keni vendosur variablën e mjedisit MYVAR në "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Baraz boolean True

ENV.NEW_VAR = 100  # Vendos një variabël të re mjedisi

Siç shihet nga shembulli, pĂ«r tĂ« punuar me klasĂ«n e re, mjafton ta importoni (nuk Ă«shtĂ« e nevojshme tĂ« krijoni njĂ« instancĂ« — minus veprimi i panevojshĂ«m). Qasja nĂ« çdo variabĂ«l mjedisi arrihet duke iu referuar asaj si njĂ« variabĂ«l e klasĂ«s ENV, qĂ«, nĂ« fakt, e bĂ«n kĂ«tĂ« klasĂ« njĂ« mbĂ«shtetje intuitivisht pĂ«r ambientin natyror tĂ« sistemit, pĂ«rveçse e shndĂ«rron atĂ« nĂ« njĂ« variant tĂ« mundshĂ«m tĂ« objektit tĂ« konfigurimit pĂ«r pothuajse çdo sistem (njĂ« qasje e ngjashme, pĂ«r shembull, arrin nĂ« Django, vetĂ«m se atje objekti i konfigurimit Ă«shtĂ« nĂ« mĂ«nyrĂ« direkte moduli/paketa settings).

Aktivizimi/deaktivizimi i modit tĂ« mbĂ«shtetjes pĂ«r tipizimin automatik arrihet pĂ«rmes pĂ«rdorimit tĂ« dy metodave — enable_automatic_type_cast() dhe disable_automatic_type_cast(). Kjo mund tĂ« jetĂ« e dobishme, nĂ«se variabla mjedisi mban njĂ« objekt tĂ« serializuar tĂ« ngjashĂ«m me JSON ose madje thjesht njĂ« konstantĂ« boolean (shprehja e qartĂ« e variablĂ«s DEBUG nĂ« Django duke e krahasuar atĂ« me 'tĂ« lejuarat' rreshta — njĂ« nga rastet mĂ« tĂ« zakonshme). Por tani nuk ka nevojĂ« pĂ«r tĂ« konvertuar shprehimisht vargjet — shumica e veprimeve tĂ« nevojshme janĂ« tashmĂ« tĂ« inkorporuara nĂ« thellĂ«sitĂ« e bibliotekĂ«s dhe vetĂ«m presin sinjalin pĂ«r veprim. 🙂 NĂ« pĂ«rgjithĂ«si, tipizimi funksionon nĂ« mĂ«nyrĂ« transparente dhe mbĂ«shtet pothuajse tĂ« gjitha tipet e dhĂ«nave tĂ« ndĂ«rtuara qĂ« ekzistojnĂ« (frozenset, complex dhe bytes nuk janĂ« testuar).

Kërkesa për mbështetje të Python 2 është realizuar praktikisht pa viktima (heqjen e typing dhe disa 'candies' të fundit të versioneve të Python 3), veçanërisht falë gjithanshëmërisë six (për zgjidhjen e problemeve me përdorimin e metaklasave).

Por ka disa kufizime:

  • MbĂ«shtetje pĂ«r Python 3 nĂ«nkupton versionin 3.5 dhe mĂ« lart (prania e tyre nĂ« projektin tuaj Ă«shtĂ« rezultat i lenies ose mungesĂ«s sĂ« nevojĂ«s pĂ«r pĂ«rmirĂ«sime, pasi Ă«shtĂ« e vĂ«shtirĂ« tĂ« imagjinohet njĂ« arsye objektive pse ende jeni nĂ« 3.4);
  • NĂ« Python 2.7 biblioteka nuk mbĂ«shtet deserializimin e literalĂ«ve tĂ« grupeve. PĂ«rshkrimi kĂ«tu. Por, nĂ«se dikush dĂ«shiron ta realizojĂ« — mirĂ«priteni:);

Biblioteka gjithashtu ka një mekanizëm për menaxhimin e përjashtimeve në rast gabimesh në analizë. Nëse një varg nuk është njohur nga asnjë nga analizatorët e disponueshëm, vlera mbetet varg (me shumë, nga konsideratat e lehtësisë dhe të kthimit në përputhje 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Ă« (pĂ«rshkrimin e disavantazheve tĂ« analogĂ«ve tĂ« disponueshĂ«m do ta lĂ« pĂ«rjashtuar — Ă«shtĂ« e ngjashme me atĂ« qĂ« pĂ«rshkruhet pĂ«r smart-env. AnalogĂ«t — kĂ«tu dhe kĂ«tu).

Në përgjithësi, ideja e realizimit dhe kërkesat e saj janë të ngjashme me ato të përshkruara për smart-env, 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 të tanishëm 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ë dosje të re

Ideja është kështu:

  1. Një klasë e vetme, që personifikon Bash në botën e Python;
  2. Çdo komandĂ« Bash thirret si funksion i klasĂ«s Shell;
  3. Parametrat e thirrjes së çdo funksioni më pas dërgohen 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Ă« qasje sinjronike;
  5. ka mundësinë për të aksesuar daljen e komandës në stdout, si dhe kodin e saj të kthimit;
  6. NĂ«se komanda nuk Ă«shtĂ« e pranishme nĂ« sistem — njĂ« pĂ«rjashtim Ă«shtĂ« hedhur.

Si në rastin e smart-env, sigurohet mbështetje për Python 2 (në të vërtetë, është dashur pak më shumë gjak sakrificë) dhe nuk ka mbështetje për Python 3.0-3.4.

Planet për zhvillimin e bibliotekave

Mund të përdoren bibliotekat si tani: të dyja janë publikuar në PyPI zyrtare. Burimet janë të disponueshme në Github (shih më poshtë).

Të dy bibliotekat do të zhvillohen duke marrë parasysh feedback-un e mbledhur nga të interesuarit. Dhe, ndoshta në smart-env është një sfidë për të menduar për diversitetin e karakteristikave të reja, por në python-shell ka ende shumë për të shtuar:

  • mbĂ«shtetje pĂ«r thirrje jo-bllokuese;
  • mundĂ«sia pĂ«r komunikim tĂ« ndĂ«rveprueshĂ«m me ekipin (puna me stdin);
  • shtimi i pronarive tĂ« reja (p.sh. pronĂ« pĂ«r tĂ« marrĂ« daljen nga stderr);
  • implementimi i njĂ« katalogu tĂ« komandave tĂ« disponueshme (pĂ«r t'u pĂ«rdorur me funksionin dir());
  • etj.

Linket

  1. Biblioteka smart-env: Github dhe PyPI
  2. Biblioteka python-shell: Github dhe PyPI
  3. Kanal Telegram aktualizimeve të bibliotekave

UPD 23.02.2020:
* Repo janë trasferuar, lidhjet përkatëse janë përditësuar
* Versioni python-shell==1.0.1 është në përgatitje për t'u lëshuar më 29.02.2020. Ndër ndryshimet: mbështetje për autokcomplete të komandave dhe komandës dir(Shell), ekzekutimi i komandave me identifikues jo të vlefshëm për Python, rregullimi i gabimeve.

Burimi: habr.com

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