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:
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());
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.