Crearea prieteniei Python și Bash: biblioteci smart-env și python-shell

Bună ziua tuturor.

Astăzi, Python este unul dintre cele mai utilizate limbaje în domeniul creării nu numai a produselor software în sine, ci și al furnizării infrastructurii acestora. Ca urmare, mulți devopți, fie prin voința lor, fie împotriva ei, au trebuit să învețe o nouă limbă pentru a fi folosită ulterior ca supliment la vechile scripturi Bash. Cu toate acestea, Bash și Python profesează abordări diferite pentru scrierea codului și au anumite caracteristici, ceea ce înseamnă că portarea scripturilor Bash în „limbajul șarpelui” se dovedește uneori a fi o sarcină încăpătoare și departe de a fi banală.

Pentru a face viața mai ușoară pentru devop, multe biblioteci și utilități utile în Python au fost create și continuă să fie create. Acest articol descrie două biblioteci noi create de autorul acestei postări - smart-env и python-shell - și conceput pentru a scuti devopții de nevoia de a acorda multă atenție complexității lucrului cu Python, lăsând loc pentru sarcini mai interesante. Domeniul de activitate al bibliotecilor este variabilele de mediu și lansarea de utilități externe.

Oricine este interesat, vă rugăm să vedeți cat.

„Biciclete” noi?

S-ar părea, de ce să creăm pachete noi pentru operațiuni destul de obișnuite? Ce vă împiedică să utilizați direct os.environ și subprocess.<metoda sau clasa la alegere>?

Voi oferi dovezi în favoarea fiecărei biblioteci separat.

biblioteca smart-env

Înainte de a-ți scrie propria idee, este util să intri online și să cauți soluții gata făcute. Desigur, există riscul de a nu găsi ceea ce aveți nevoie, dar acesta este mai degrabă un „eveniment de asigurare”. De regulă, această abordare funcționează și economisește mult timp și efort.

Conform rezultatelor motor de căutare a fost dezvăluit următoarele:

  • există pachete care de fapt împachetează apeluri la os.environ, dar în același timp necesită o grămadă de acțiuni care distrag atenția (crearea unei instanțe a unei clase, parametri speciali în apeluri etc.);
  • Există pachete bune, care, totuși, sunt strict legate de un ecosistem specific (în principal cadre web precum Django) și, prin urmare, nu sunt deloc universale fără un fișier;
  • sunt rare încercări de a face ceva nou. De exemplu, adăugați tastare și analizați în mod explicit valorile variabilelor apelând metode precum
    get_<typename>(var_name)

    Sau aici inca o solutie, care, totuși, nu acceptă Python-ul 2 acum disgraziat (care, în ciuda RIP oficial, există încă munți de cod scris și ecosisteme întregi);

  • Există meșteșuguri de școală care, dintr-un motiv necunoscut, au ajuns în PyPI din amonte și creează doar probleme cu denumirea pachetelor noi (în special, numele „smart-env” este o măsură necesară).

Și această listă poate dura mult timp. Cu toate acestea, punctele de mai sus au fost suficiente pentru a mă entuziasma ideea de a face ceva convenabil și universal.

Cerințe care au fost stabilite înainte de a scrie smart-env:

  • Cea mai simplă schemă de utilizare
  • Suport de tastare a datelor ușor de configurat
  • Compatibil cu Python 2.7
  • Acoperire bună a codului prin teste

Până la urmă, toate acestea s-au realizat. Iată un exemplu de utilizare:

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

După cum puteți vedea din exemplu, pentru a lucra cu o nouă clasă, trebuie doar să o importați (nu trebuie să creați o instanță - minus acțiunea suplimentară). Accesul la orice variabilă de mediu se realizează prin referirea la aceasta ca la o variabilă a clasei ENV, ceea ce, de fapt, face din această clasă un înveliș intuitiv pentru mediul de sistem nativ, transformând-o simultan într-un posibil obiect de configurare pentru aproape orice sistem ( o abordare similară, de exemplu, este realizată în Django, doar acolo obiectul de configurare este modulul/pachetul de setări însuși).

Activarea/dezactivarea modului de suport pentru tastarea automată se realizează folosind două metode - enable_automatic_type_cast() și disable_automatic_type_cast(). Acest lucru poate fi convenabil dacă variabila de mediu conține un obiect asemănător JSON serializat sau chiar doar o constantă booleană (setarea explicită a variabilei DEBUG în Django prin compararea variabilei de mediu cu șiruri „valide” este unul dintre cele mai frecvente cazuri). Dar acum nu este nevoie să convertiți în mod explicit șirurile de caractere - majoritatea acțiunilor necesare sunt deja încorporate în adâncurile bibliotecii și așteaptă doar un semnal să acționeze. 🙂 În general, tastarea funcționează transparent și acceptă aproape toate tipurile de date încorporate disponibile (înghețat, complex și octeți nu au fost testați).

Cerința de a sprijini Python 2 a fost implementată practic fără sacrificii (abandonarea tastării și unele dintre „bomboanele de zahăr” ale ultimelor versiuni de Python 3), în special, datorită celor șase omniprezente (pentru a rezolva problemele de utilizare a metaclaselor). ).

Dar există câteva restricții:

  • Suportul Python 3 înseamnă versiunea 3.5 și superioară (prezența lor în proiectul dvs. este rezultatul fie al lenei, fie al lipsei nevoii de îmbunătățiri, deoarece este dificil să veniți cu un motiv obiectiv pentru care sunteți încă pe 3.4);
  • În Python 2.7, biblioteca nu acceptă deserializarea literalelor setului. Descriere aici. Dar, dacă dorește cineva să o implementeze, ești binevenit :);

Biblioteca are și un mecanism de excepție în cazul erorilor de analiză. Dacă șirul nu a putut fi recunoscut de niciunul dintre analizoarele disponibile, valoarea rămâne un șir (mai degrabă, din motive de comoditate și compatibilitate inversă cu logica obișnuită a modului în care variabilele funcționează în Bash).

biblioteca python-shell

Acum vă voi spune despre a doua bibliotecă (voi omite descrierea deficiențelor analogilor existenți - este similară cu cea descrisă pentru smart-env. Analogi - aici и aici).

În general, ideea de implementare și cerințele pentru aceasta sunt similare cu cele descrise pentru smart-env, așa cum se poate vedea din exemplu:

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

Ideea este aceasta:

  1. O singură clasă care reprezintă Bash în lumea Python;
  2. Fiecare comandă Bash este apelată ca o funcție a clasei Shell;
  3. Parametrii pentru fiecare apel de funcție sunt apoi trecuți în apelul de comandă Bash corespunzător;
  4. Fiecare comandă este executată „aici și acum” în momentul în care este apelată, adică. abordarea sincronă funcționează;
  5. este posibil să accesați rezultatul unei comenzi în stdout, precum și codul de returnare al acesteia;
  6. Dacă comanda nu este în sistem, se aruncă o excepție.

Ca și în cazul smart-env, există suport pentru Python 2 (deși a fost nevoie de puțin mai mult sânge sacrificial) și nu există suport pentru Python 3.0-3.4.

Planuri de dezvoltare a bibliotecii

Puteți folosi bibliotecile acum: ambele sunt postate pe PyPI oficial. Sursele sunt disponibile pe Github (vezi mai jos).

Ambele biblioteci vor fi dezvoltate ținând cont de feedback-ul colectat de la cei interesați. Și, dacă poate fi dificil să veniți cu o varietate de caracteristici noi în smart-env, atunci în python-shell există cu siguranță altceva de adăugat:

  • suport pentru apeluri neblocante;
  • posibilitate de comunicare interactivă cu echipa (lucru cu stdin);
  • adăugarea de noi proprietăți (de exemplu, proprietate pentru a primi rezultate de la stderr);
  • implementarea unui director de comenzi disponibile (pentru utilizarea cu funcția dir());
  • etc

referințe

  1. biblioteca smart-env: Github и PyPI
  2. biblioteca python-shell: Github и PyPI
  3. Canalul Telegram actualizări de bibliotecă

UPD23.02.2020:
* Arhivele au fost mutate, linkurile corespunzătoare au fost actualizate
* Versiunea python-shell==1.0.1 este pregătită pentru lansare pe 29.02.2020. Modificările includ suport pentru completarea automată a comenzii și comanda dir(Shell), rularea comenzilor cu un identificator Python nevalid și remedieri de erori.

Sursa: www.habr.com

Adauga un comentariu