Krijimi i miqësisë me Python dhe Bash: bibliotekat smart-env dhe python-shell

dite te mire te gjitheve.

Sot, Python është një nga gjuhët më të përdorura në fushën e krijimit jo vetëm të vetë produkteve softuerike, por edhe të ofrimit të infrastrukturës së tyre. Si rezultat, shumë prej tyre, qoftë me vullnetin e tyre apo kundër tij, duhej të mësonin një gjuhë të re për t'u përdorur më vonë si një shtesë e skripteve të vjetra të mira Bash. Sidoqoftë, Bash dhe Python pretendojnë qasje të ndryshme për të shkruar kodin dhe kanë veçori të caktuara, që do të thotë se transferimi i skripteve Bash në "gjuhën e gjarpërinjve" ndonjëherë rezulton të jetë një detyrë e madhe dhe jo e parëndësishme.

Për ta bërë jetën më të lehtë për devops, shumë biblioteka dhe shërbime të dobishme në Python janë krijuar dhe vazhdojnë të krijohen. Ky artikull përshkruan dy biblioteka të reja të krijuara nga autori i këtij postimi - inteligjente-mbi и guaskë pitoni - dhe projektuar për të lehtësuar devops nga nevoja për t'i kushtuar shumë vëmendje ndërlikimeve të punës me Python, duke lënë hapësirë ​​për detyra më interesante. Fushëveprimi i bibliotekave është variablat e mjedisit dhe lëshimi i shërbimeve të jashtme.

Kushdo që është i interesuar, ju lutemi të shihni cat.

“Biçikleta” të reja?

Do të duket, pse të krijoni paketa të reja për operacione mjaft të zakonshme? Çfarë ju pengon të përdorni os.environ dhe nënprocesin.<metoda ose klasa sipas zgjedhjes suaj> drejtpërdrejt?

Unë do të jap dëshmi në favor të secilës prej bibliotekave veç e veç.

biblioteka smart-env

Përpara se të shkruani idenë tuaj, është e dobishme të shkoni në internet dhe të kërkoni zgjidhje të gatshme. Sigurisht, ekziston rreziku që të mos gjeni atë që ju nevojitet, por kjo është më tepër një "ngjarje sigurimi". Si rregull, kjo qasje funksionon dhe kursen shumë kohë dhe përpjekje.

Sipas rezultateve kërko u zbulua e mëposhtme:

  • ka paketa që mbështjellin thirrjet në os.environ, por në të njëjtën kohë kërkojnë një sërë veprimesh shpërqendruese (krijimi i një shembulli të një klase, parametra të veçantë në thirrje, etj.);
  • Ka paketa të mira, të cilat, megjithatë, janë të lidhura rreptësisht me një ekosistem specifik (kryesisht korniza në internet si Django) dhe për këtë arsye nuk janë aspak universale pa skedar;
  • Ka përpjekje të rralla për të bërë diçka të re. Për shembull, shtoni shtypjen dhe analizoni në mënyrë eksplicite vlerat e variablave duke thirrur metoda si
    get_<typename>(var_name)

    Ose këtu një zgjidhje më shumë, i cili, megjithatë, nuk mbështet Python 2 tani të turpëruar (i cili, pavarësisht RIP zyrtare, ka ende male kodesh të shkruara dhe ekosisteme të tëra);

  • Ka vepra artizanale të studentëve që, për ndonjë arsye të panjohur, përfunduan në rrjedhën e sipërme të PyPI dhe krijojnë probleme vetëm me emërtimin e paketave të reja (në veçanti, emri "smart-env" është një masë e nevojshme).

Dhe kjo listë mund të vazhdojë për një kohë të gjatë. Megjithatë, pikat e mësipërme ishin të mjaftueshme për të më emocionuar për idenë për të bërë diçka të përshtatshme dhe universale.

Kërkesat që u vendosën përpara se të shkruani smart-env:

  • Skema më e thjeshtë e përdorimit
  • Mbështetje për shtypjen e të dhënave lehtësisht të konfigurueshme
  • E përputhshme me Python 2.7
  • Mbulim i mirë i kodit nga testet

Në fund të fundit, e gjithë kjo u realizua. Këtu është një shembull përdorimi:

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

Siç mund ta shihni nga shembulli, për të punuar me një klasë të re, thjesht duhet ta importoni atë (nuk keni nevojë të krijoni një shembull - minus veprimin shtesë). Qasja në çdo variabël mjedisor arrihet duke iu referuar si një variabël të klasës ENV, e cila, në fakt, e bën këtë klasë një mbështjellës intuitiv për mjedisin e sistemit vendas, duke e kthyer njëkohësisht atë në një objekt të mundshëm konfigurimi për pothuajse çdo sistem ( një qasje e ngjashme, për shembull, arrihet në Django, vetëm aty objekti i konfigurimit është vetë moduli/paketa e cilësimeve).

Aktivizimi/çaktivizimi i mënyrës së mbështetjes automatike të shtypjes arrihet duke përdorur dy metoda - enable_automatic_type_cast() dhe disable_automatic_type_cast(). Kjo mund të jetë e përshtatshme nëse ndryshorja e mjedisit përmban një objekt të serializuar të ngjashëm me JSON ose edhe thjesht një konstante Boolean (vendosja në mënyrë eksplicite e ndryshores DEBUG në Django duke krahasuar variablin e mjedisit me vargjet "të vlefshme" është një nga rastet më të zakonshme). Por tani nuk ka nevojë të konvertohen në mënyrë eksplicite vargjet - shumica e veprimeve të nevojshme janë ngulitur tashmë në thellësitë e bibliotekës dhe thjesht presin një sinjal për të vepruar. 🙂 Në përgjithësi, shtypja funksionon në mënyrë transparente dhe mbështet pothuajse të gjitha llojet e të dhënave të integruara në dispozicion (të ngrira, komplekse dhe bajt nuk u testuan).

Kërkesa për të mbështetur Python 2 u zbatua praktikisht pa sakrifica (braktisja e shtypjes dhe disa prej "karamele sheqeri" të versioneve më të fundit të Python 3), në veçanti, falë gjashtë të kudogjendurve (për të zgjidhur problemet e përdorimit të metaklasave ).

Por ka disa kufizime:

  • Mbështetja e Python 3 nënkupton versionin 3.5 dhe më të lartë (prania e tyre në projektin tuaj është rezultat ose i përtacisë ose mungesës së nevojës për përmirësime, pasi është e vështirë të dalësh me një arsye objektive pse jeni ende në 3.4);
  • Në Python 2.7, biblioteka nuk e mbështet deserializimin e literaleve të grupeve. Përshkrim këtu. Por nëse dikush dëshiron ta zbatojë, ju mirëpresim :);

Biblioteka gjithashtu ka një mekanizëm përjashtimi në rast të gabimeve të analizimit. Nëse vargu nuk mund të njihet nga asnjë prej analizuesve të disponueshëm, vlera mbetet një varg (përkundrazi, për arsye komoditeti dhe pajtueshmërie me logjikën e zakonshme se si funksionojnë variablat në Bash).

bibliotekë python-shell

Tani do t'ju tregoj për bibliotekën e dytë (do të heq përshkrimin e mangësive të analogëve ekzistues - është i ngjashëm me atë të përshkruar për smart-env. Analoge - këtu и këtu).

Në përgjithësi, ideja e zbatimit dhe kërkesat për të janë të ngjashme me ato të përshkruara për smart-env, siç mund të shihet nga shembulli:

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

Ideja është kjo:

  1. Një klasë e vetme që përfaqëson Bash në botën Python;
  2. Çdo komandë Bash thirret si funksion i klasës Shell;
  3. Parametrat për çdo thirrje funksioni kalohen më pas në thirrjen përkatëse të komandës Bash;
  4. Çdo komandë ekzekutohet “këtu dhe tani” në momentin që thirret, d.m.th. funksionon qasja sinkrone;
  5. është e mundur të aksesoni daljen e një komande në stdout, si dhe kodin e kthimit të saj;
  6. Nëse komanda nuk është në sistem, bëhet një përjashtim.

Ashtu si me smart-env, ka mbështetje për Python 2 (megjithëse kërkohej pak më shumë gjak sakrifikues) dhe nuk ka mbështetje për Python 3.0-3.4.

Planet e zhvillimit të bibliotekës

Ju mund të përdorni bibliotekat tani: të dyja janë postuar në PyPI zyrtare. Burimet janë të disponueshme në Github (shih më poshtë).

Të dyja bibliotekat do të zhvillohen duke marrë parasysh komentet e mbledhura nga të interesuarit. Dhe, nëse mund të jetë e vështirë të krijohen një sërë veçorish të reja në smart-env, atëherë në python-shell ka patjetër diçka tjetër për të shtuar:

  • mbështetje për thirrjet jo-bllokuese;
  • mundësia e komunikimit interaktiv me ekipin (duke punuar me stdin);
  • shtimi i pronave të reja (për shembull, pronë për të marrë dalje nga stderr);
  • implementimi i një drejtorie të komandave të disponueshme (për përdorim me funksionin dir());
  • etj

Referencat

  1. biblioteka smart-env: Github и PyPI
  2. biblioteka python-shell: Github и PyPI
  3. Kanali i telegramit përditësimet e bibliotekës

UPD 23.02.2020/XNUMX/XNUMX:
* Depot janë zhvendosur, lidhjet përkatëse janë përditësuar
* Versioni python-shell==1.0.1 po përgatitet për publikim më 29.02.2020/XNUMX/XNUMX. Ndryshimet përfshijnë mbështetjen për plotësimin automatik të komandës dhe komandën dir(Shell), ekzekutimin e komandave me një identifikues të pavlefshëm Python dhe rregullime të gabimeve.

Burimi: www.habr.com

Shto një koment