Fà Python è Bash Friendship: librerie smart-env è python-shell

Bon ghjornu à tutti.

Oghje, Python hè una di e lingue più usate in u campu di creà micca solu i prudutti di software, ma ancu furnisce a so infrastruttura. In u risultatu, assai devops, per a so vulintà o contru, anu da amparà una nova lingua per l'usu dopu cum'è un supplementu à i boni vechji scripts Bash. In ogni casu, Bash è Python professanu approcci diffirenti per scrive codice è anu certe caratteristiche, chì significheghja chì u porting di script Bash à a "lingua serpente" a volte risulta esse un compitu capiente è luntanu da triviale.

Per fà a vita più faciule per i devops, parechje biblioteche utili è utilità in Python sò state create è cuntinueghjanu à esse create. Questu articulu descrive duie biblioteche novi create da l'autore di stu post - smart-env и python-shell - è cuncepitu per esaltà i devops da a necessità di pagà assai attenzione à l'intricacies di travaglià cù Python, lascendu spaziu per i travaglii più interessanti. U scopu di l'attività di e biblioteche sò variabili di l'ambiente è lanciari utilità esterne.

Qualchissia interessatu, per piacè vede cat.

"Biciclette" novi ?

Sembra, perchè creà novi pacchetti per operazioni abbastanza ordinarie? Chì vi impedisce di utilizà os.environ è subprocess.<metudu o classa di a vostra scelta> direttamente?

Forniraghju evidenza in favore di ognuna di e biblioteche separatamente.

biblioteca smart-env

Prima di scrive u vostru propiu brainchild, hè utile per andà in linea è cercate suluzioni pronti. Di sicuru, ci hè u risicu di ùn truvà micca ciò chì avete bisognu, ma questu hè piuttostu un "avvenimentu d'assicuranza". Comu regula, stu approcciu travaglia è salva assai tempu è sforzu.

Sicondu i risultati circà u seguente hè statu revelatu:

  • ci sò pacchetti chì invechjanu e chjama à os.environ, ma à u stessu tempu necessitanu una mansa d'azzioni distracting (creendu una istanza di una classa, paràmetri spiciali in chjama, etc.);
  • Ci sò boni pacchetti, chì, però, sò strettamente ligati à un ecosistema specificu (principalmente frameworks web cum'è Django) è per quessa ùn sò micca universali senza un schedariu;
  • ci sò rari tentativi di fà qualcosa di novu. Per esempiu, aghjunghje typing è analizà esplicitamente i valori variabili chjamendu metudi cum'è
    get_<typename>(var_name)

    O quì una solu suluzione, chì, però, ùn sustene micca l'oghje disgraziatu Python 2 (chì, malgradu RIP ufficiale, ci sò sempre muntagne di codice scrittu è ecosistemi interi);

  • Ci sò artisgiani di i studienti di a scola chì, per una ragione scunnisciuta, anu finitu in upstream PyPI è creanu solu prublemi cù a denominazione di novi pacchetti (in particulare, u nome "smart-env" hè una misura necessaria).

È sta lista pò cuntinuà per un bellu pezzu. Tuttavia, i punti di sopra sò stati abbastanza per entusiasmassi l'idea di fà qualcosa di cunvene è universale.

Requisiti chì sò stati stabiliti prima di scrive smart-env:

  • U schema di usu più simplice
  • Supportu di scrittura di dati facilmente configurabile
  • Compatibile cù Python 2.7
  • Una bona copertura di codice da teste

In fine, tuttu questu hè statu realizatu. Eccu un esempiu di usu:

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

Comu pudete vede da l'esempiu, per travaglià cù una nova classa, basta à impurtà (ùn hè micca bisognu di creà una istanza - minus l'azzione extra). L'accessu à qualsiasi variabile di l'ambiente hè ottenutu riferenu à questu cum'è una variabile di a classa ENV, chì, in fattu, face sta classa un wrapper intuitivu per l'ambienti di u sistema nativu, mentre chì simultaneamente si trasforma in un ughjettu di cunfigurazione pussibule per quasi ogni sistema ( un approcciu simili, per esempiu, hè ottenutu in Django , solu quì l'ughjettu di cunfigurazione hè u modulu di paràmetri / pacchettu stessu).

L'attivazione / disattivazione di u modu di supportu di scrittura automatica hè ottenuta cù dui metudi - enable_automatic_type_cast () è disable_automatic_type_cast (). Questu pò esse convenientu se a variabile di l'ambiente cuntene un ughjettu serializatu simili à JSON o ancu solu una constante Booleana (esplicitamente stabilisce a variabile DEBUG in Django paragunendu a variabile di l'ambiente cù stringhe "valide" hè unu di i casi più cumuni). Ma avà ùn ci hè bisognu di cunvertisce esplicitamente strings - a maiò parte di l'azzioni necessarii sò digià incrustati in a prufundità di a biblioteca è sò solu aspittendu un signalu per agisce. 🙂 In generale, a digitazione funziona in modu trasparente è supporta quasi tutti i tipi di dati integrati dispunibili (congelati, cumplessi è byte ùn sò micca stati testati).

L'esigenza di supportà Python 2 hè stata implementata cù praticamenti senza sacrifici (l'abbandunamentu di typing è alcuni di i "zuccheri" di l'ultime versioni di Python 3), in particulare, grazia à l'omnipresenti sei (per risolve i prublemi di l'usu di metaclassi). ).

Ma ci sò alcune restrizioni:

  • U supportu di Python 3 significa a versione 3.5 è più altu (a so prisenza in u vostru prughjettu hè u risultatu di a pigrizia o di a mancanza di bisognu di migliurà, postu chì hè difficiule di vene cun un mutivu objettivu per quessa chì site sempre in 3.4);
  • In Python 2.7, a libreria ùn sustene micca a deserializazione di i literali set. Descrizzione ccà. Ma s'ellu ci vole à mette in opera, hè benvenutu :);

A biblioteca hà ancu un mecanismu d'eccezzioni in casu di errore di analisi. Se a stringa ùn puderia micca esse ricunnisciuta da alcunu di l'analizatori dispunibuli, u valore resta una stringa (piuttostu, per ragioni di comodità è cumpatibilità retrocede cù a logica abituale di cumu travaglianu e variàbili in Bash).

libreria python-shell

Avà vi cuntaraghju di a seconda biblioteca (ometteraghju a descrizzione di i difetti di l'analogi esistenti - hè simile à quellu descrittu per smart-env. Analogues - ccà и ccà).

In generale, l'idea di implementazione è i requisiti per questu sò simili à quelli descritti per smart-env, cum'è pò esse vistu da l'esempiu:

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

L'idea hè questu:

  1. Una sola classa chì rapprisenta Bash in u mondu Python;
  2. Ogni cumandamentu Bash hè chjamatu cum'è una funzione di a classe Shell;
  3. I paràmetri per ogni chjama di funzione sò allora passati in a chjama di cumandamentu Bash currispundente;
  4. Ogni cumanda hè eseguitu "quì è avà" à u mumentu chì hè chjamatu, i.e. l'approcciu sincronu travaglia;
  5. hè pussibule accede à l'output di un cumandamentu in stdout, è ancu u so codice di ritornu;
  6. Se u cumandamentu ùn hè micca in u sistema, una eccezzioni hè ghjittata.

Cum'è cù smart-env, ci hè un supportu per Python 2 (ancu se era necessariu un pocu di sangue più sacrificale) è nisun supportu per Python 3.0-3.4.

Piani di sviluppu di a biblioteca

Pudete aduprà e biblioteche avà: i dui sò publicati nantu à u PyPI ufficiale. I fonti sò dispunibili nantu à Github (vede quì sottu).

E duie biblioteche seranu sviluppate tenendu in contu i feedback raccolti da quelli interessati. È, s'ellu pò esse difficiule di vene cun una varietà di funzioni novi in ​​smart-env, allora in python-shell ci hè certamente qualcosa à aghjunghje:

  • supportu per chjamate senza bloccu;
  • pussibilità di cumunicazione interattiva cù a squadra (travagliu cù stdin);
  • agghiuncennu novi pruprietà (per esempiu, pruprietà per riceve output da stderr);
  • implementazione di un repertoriu di cumandamenti dispunibili (per aduprà cù a funzione dir());
  • è cusì.

referenze

  1. biblioteca smart-env: Github и PyPI
  2. libreria python-shell: Github и PyPI
  3. Canale di Telegram l'aghjurnamenti di a biblioteca

UPD 23.02.2020/XNUMX/XNUMX :
* I repositori sò stati spustati, i ligami currispondenti sò stati aghjurnati
* A versione python-shell==1.0.1 hè preparata per a liberazione u 29.02.2020/XNUMX/XNUMX. I cambiamenti includenu supportu per l'autocomplete di u cumandimu è u cumandamentu dir (Shell), l'esecuzione di cumandamenti cù un identificatore Python invalidu, è correzioni di bug.

Source: www.habr.com

Add a comment