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 - и - è 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 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, è analizà esplicitamente i valori variabili chjamendu metudi cum'è
get_<typename>(var_name)O quì , chì, però, ùn sustene micca l'oghje disgraziatu Python 2 (chì, malgradu , 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 . 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 - и ).
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:
- Una sola classa chì rapprisenta Bash in u mondu Python;
- Ogni cumandamentu Bash hè chjamatu cum'è una funzione di a classe Shell;
- I paràmetri per ogni chjama di funzione sò allora passati in a chjama di cumandamentu Bash currispundente;
- Ogni cumanda hè eseguitu "quì è avà" à u mumentu chì hè chjamatu, i.e. l'approcciu sincronu travaglia;
- hè pussibule accede à l'output di un cumandamentu in stdout, è ancu u so codice di ritornu;
- 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
- biblioteca smart-env: и
- libreria python-shell: и
- 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
