Scriem scripturi shell pe python și le putem înlocui cu bash

Scriem scripturi de shell în Python și le pot înlocui cu Bash +36

  • 21.02.16 02:31 •
  • lamerman •
  • # 277679
  • Habrahabr •
  • 34 •
  • 26400

- la fel ca Forbes, doar mai bine.







Acest articol mic se va concentra pe faptul dacă este ușor să utilizați Python pentru a scrie scripturi în loc de Bash / Sh. Prima întrebare care va apărea probabil din partea cititorului și de ce, de fapt, să nu folosiți Bash / Sh, care au fost create special pentru acest scop? Au fost create cu mult timp în urmă și, după părerea mea, au o sintaxă destul de specifică, care nu este foarte asemănătoare cu alte limbi, ceea ce este greu de reținut dacă nu sunteți administrator de 50+. Vă amintiți cum să scrieți o simplă întrebare dacă o faceți?


Adevăr elementar? Sintaxă intuitivă. )

Cu toate acestea, în Python, aceste construcții sunt mult mai simple. De fiecare dată când scriu ceva pe bas, cu siguranță mă urc în motorul de căutare pentru a-mi aminti cum să scriu un simplu buton, comutator sau altceva. Îmi amintesc deja sarcina. ) În Python, totul este diferit. Deși nu scriu toată ziua și noaptea, n-am trebuit niciodată să urc și să văd cum să facă un ciclu simplu, deoarece sintaxa limbii este simplă și intuitivă. În plus, este mult mai aproape de restul limbilor mainstream, cum ar fi java sau c ++, decât Bash / Sh.

De asemenea, în bibliotecile standard și în alte biblioteci Python există biblioteci mult mai convenabile decât utilitarele de consolă. Să spunem că doriți să dispersați json, xml, yaml. Știți ce am văzut recent codul în bas pentru a face asta? corecta:


Și nu era codul meu. A fost un cod neutru / uman bache / python.

Este același lucru cu regex, sed este fără îndoială utilitate la îndemână, dar câți oameni își amintesc cum să o folosească corect? Ei bine, cu excepția lui Lee E. McMahon, cine la creat. Da, mulți își amintesc principiul, chiar îmi amintesc cum să fac lucruri simple. Dar, în opinia mea, modulul Python este mult mai convenabil.

În acest scurt articol, aș vrea să vă prezint un dialect pe Python numit shellpy și servește pentru a face posibilă înlocuirea lui Bash cu Python în scripturi.


Shell python nu se deosebește de Python simplu, cu excepția unei părți. Expresiile din interiorul caracterelor de accent grav (`), spre deosebire de Python, nu sunt eval, ci înseamnă executarea unei comenzi într-un shell. De exemplu


execută ls -l ca comandă shell. Este, de asemenea, posibil să scrieți toate acestea fără "la sfârșitul liniei


și aceasta va fi, de asemenea, o sintaxă corectă.

Puteți executa mai multe comenzi simultan pe diferite linii


și comenzi care ocupă mai multe linii


Executarea fiecărei expresii din shellpy returnează un obiect din clasa Rezultat


Poate fi fie Rezultat, fie InteractiveResult (Link-uri către githab cu documentație, de asemenea poți să te uiți :)). Să începem cu un simplu rezultat. Din acesta puteți obține cu ușurință codul de returnare al comenzii executate


Și textul de la stdout și stderr


Puteți trece, de asemenea, peste toate liniile care stdout comanda executată într-o buclă

Există, de asemenea, o mulțime de zahăr sintactic pentru rezultat. De exemplu, putem verifica cu ușurință că codul de returnare al executabilului este zero


Sau modalitatea mai simplă de a obține textul din stdout


Toate cele de mai sus reprezintă o prezentare generală a sintaxei pe scurt pentru a înțelege pur și simplu ideea de bază și nu vă încărcați cu toate detaliile. Există multe alte lucruri acolo pentru a interacționa interactiv cu comenzile care sunt executate, pentru a controla execuția comenzilor. Dar acestea sunt toate detaliile pe care le puteți arunca în documentație (în limba engleză), dacă ideea însăși pare interesantă pentru dvs.

Ei bine, aceasta nu este sintaxa valabilă a lui Python, cum funcționează toate acestea?


Magic, bineînțeles, de asemenea :) Da, prietenii mei, trebuia să folosesc preprocesarea, mărturisesc, dar nu am găsit altă cale. Am văzut alte biblioteci care fac ceva similar fără a rupe sintaxa limbii

Familiar cu tema cititorul va întreba ce IPython nu ți s-ar potrivi, e aproape că trebuie să pui o altă pictogramă, poate ești doar un motociclist care este prea leneș să privească motorul de căutare? Și adevărul este că arată astfel:


Am încercat să o folosesc, dar am întâlnit câteva probleme grave cu care nu am putut să mă înțeleg. Cel mai important este că nu există niciun import simplu ca în Python. Adică, nu puteți scrie un cod pe ipython în sine și îl puteți reutiliza ușor în alte locuri. Este imposibil să scrieți pentru modulul dvs. ipython








și că totul funcționează imediat ca un basm. Singura modalitate de reutilizare a scriptului este executarea acestuia. După executarea în mediul înconjurător, aveți toate funcțiile și variabilele declarate în fișierul executabil. Nu este cosher în opinia mea.

Codul shell-ului este reutilizat cu ușurință și importat la fel ca în Python normal. Să presupunem că avem un modul comun în care stocăm un cod foarte util. Să căutăm în directorul cu acest modul


Deci, ceea ce avem aici, bine, în prima init. dar cu extensia .spy. Aceasta este trăsătura distinctivă a modulului spion de la cel obișnuit. Să vedem, de asemenea, în interiorul fișierului common.spy, ce interesant există acolo


Vom vedea că aici este declarată o funcție care utilizează intern sintaxa shellpy pentru a returna ieșirea din "echo 5. Cum este folosit acest modul în cod? Dar cum


Vezi tu? La fel ca în Python normal, tocmai au luat și au importat.

Cum funcționează. Aceasta funcționează utilizând PEP 0302 - Cârlige de import noi. Când importați ceva în codul dvs., la început Python întreabă cârligul dacă există ceva în neregulă cu el, cârligul se uită prin PYTHONPATH pentru prezența fișierelor * .spy sau modulelor shellpython. Dacă nu este nimic, atunci spune: "Nu este nimic, să îl importați singur". Dacă găsește ceva acolo, atunci cârligul gestionează importul independent. Anume, ea preprocese fișierul într-un python obișnuit și adaugă toate aceste lucruri în directorul temp al sistemului de operare. Prin scrierea unui nou fișier sau a unui modul Python, acesta se adaugă la PYTHONPATH și se ia cel mai comun import.

Să ne uităm mai degrabă la un exemplu


Shellpython poate fi instalat în două moduri: pip install shellpy sau prin îndoirea depozitului și executarea setup.py install. După aceasta, veți avea un utilitar shell.

Să începem ceva


După instalare, puteți testa shellpython cu exemple care sunt disponibile direct în depozit.


De asemenea, aici sunt toate exemplele, numite astfel, pentru că acestea testează toate funcțiile care se află în structură. Uită-te acolo pentru a afla ce altceva există, sau doar fă-o


Pentru al treilea Python, comanda arată astfel

compatibilitate


Acest lucru funcționează pe Linux și ar trebui să funcționeze pe Mac pentru Python 2.x și 3.x. În Windows nu funcționează încă, dar nu există probleme pentru lucrare, deoarece totul a fost scris folosind biblioteci inter-platforme și nimic specific pentru platformă în cod. Doar nu a ajuns la mâna încă pentru a testa pe Windows. Nu am nici macar un Mac, dar se pare ca prietenul meu a lucrat :) Daca ai mac si totul e bine, te rog spune-mi.

Documentație (în limba engleză)

Este posibil să se înmulțească

Nu mă va rupe în producție?


Acum, versiunea 0.4.0, nu este un proces stabil și de producție până acum, este mai bine să nu legeți scenariul, așteptând până când totul merge bine. Dar în dezvoltare, CI poate fi folosit complet. Toate acestea sunt acoperite de teste și lucrări :)


Scrieți feedback-ul cu privire la idee în general și la implementarea în special, precum și despre problemele, dorințele, toată lumea este bucuroasă să audă :) Începe probleme în githaba, există deja o mulțime de ei :)

Am trăit în bash de foarte mult timp și numai anul trecut am decis să experiment din nou cu aceste medii noi. zsh a decis să săriți și a început cu xonsh, deoarece se părea că ar putea fi convenabil. În general, nu m-am întâlnit cu el din cauza ciudățeniei (autocompleția tot timpul ma împiedicat să înțeleg ce scriu) și lipsa de lucruri de bază ca și || în bash. Ei bine, suport pentru curba virtualenv (și aceasta este în shell-ul Python pentru fanii proiectelor de scriere în Python). Dar pește - într-adevăr a fost un lucru foarte plăcut, apoi oprit (chiar și un mic screencast înregistrat).

Cu doar o săptămână în urmă, adăugat la managerul de mediu xonsh :-) Există ceva de îmbunătățit, dar, în general, problema este rezolvată.

Proiectul este, unde să crească, nu mă cert.

unele elemente controversate în comparație, peștele are o istorie normală, și cu biblioteca standard, de asemenea, toate regulile, l-am folosit de un an deja, foarte mulțumit, mai ales cu gith din cutie și plugin-ul pentru virtual. Puteți să vă lămuriți despre aceste puncte?

Nu întotdeauna atât de teribil în bash, puteți utiliza operatorii de comparație obișnuiți, în loc de -ne și de alții.
Mi-a plăcut să folosesc argarp în Python, pentru comenzile consolei. Și este deja numit scriptul bash, de exemplu.

Îmi place. IMHO, în primul rând este necesar să ne gândim în direcția implementării / regeza readline pentru o astfel de coajă. Din nou IMHO - în cazul în care script-urile principale yuzekeys, șansele de a decola mult mai puțin, fără un mod interactiv convenabil în sensul.

doriți să parsezi json, xml, yaml Există jq / xmlstarlet / shyaml. apoi urcați cu siguranță în motorul de căutare În loc să vă uitați la manualul care este deja pe disc. De obicei. sintaxa limbii este simplă și intuitivă, este simplă și intuitivă, dacă știi că "cuvintele cheie" sunt de fapt numele echipelor, respectiv întotdeauna stau la început și nu mai mult de unul pentru fiecare echipă. Și așa, în Pyhton, comparativ cu "limbile mainstream", sintaxa nu este mai puțin ciudată. Și legarea sintaxei la formatarea multor perverse. Uneori e mult mai frumos să scrii un singur căptușel decât o "scară" lungă și îngustă.

Există un jq / xmlstarlet / shyaml
Nu este vorba despre faptul că există ceva în principiu, dar despre folosință.

În loc să priviți manualul care se află deja pe disc. De obicei.
De ce să urcați în manual pentru a vedea sintaxa unui operator (vă rugăm să nu o confundați cu "de ce deranjează deloc în manual", nu am spus asta :))? Motorul de căutare va răspunde instantaneu, iar manualul ar trebui să fie întâi găsit, apoi în el pentru a afla dacă.

dar despre utilitatea. Care este folosirea utilităților cu sintaxă de interogare compactă care sunt convenabile pentru scripturile CLI într-o altă limbă? Motorul de căutare va răspunde imediat dacă conexiunea este rapidă. Și chiar și așa este necesar să se uite prin câteva site-uri. manualul trebuie mai întâi să fie găsit. apoi în ea pentru a afla dacă. Dar cu aceasta există o problemă, da, există un manual mare, și există multe coliziuni pentru căutare, chiar și sub / ^ \ + + dacă se cade mult. Pe de altă parte, dacă reușiți să o faceți dintr-o dată, vă puteți aminti că comenzile sunt la final.

awk este, în general, un limbaj separat, cu o mulțime de caracteristici. Pe ea, scripturi destul de mari sunt scrise. Ei bine, sed nu este o gafă, pe lângă pop / foo / bar / există și multe caracteristici utile, de la cea mai simplă - tipărirea unei anumite game de linii (sed -n 17,19p). Și teoretic, este posibil să punem în practică orice algoritm Markov normal, dar acesta este deja un fel de perversiune.







Trimiteți-le prietenilor: