Fè Python ak Bash Friendship: bibliyotèk entelijan-env ak python-shell

Bon jounen tout moun.

Jodi a, Python se youn nan lang ki pi itilize nan domèn kreye pa sèlman pwodwi lojisyèl tèt yo, men tou bay enfrastrikti yo. Kòm yon rezilta, anpil devops, kit se pa volonte yo oswa kont li, te oblije aprann yon nouvo lang pou pita itilize kòm yon sipleman nan bon ansyen scripts Bash yo. Sepandan, Bash ak Python pwofese diferan apwòch pou ekri kòd epi yo gen sèten karakteristik, sa vle di pòtaj scripts Bash nan "lang koulèv la" pafwa vire soti nan yon travay ki gen anpil kapasite ak lwen soti nan trivial.

Pou fè lavi pi fasil pou devops, anpil bibliyotèk itil ak sèvis piblik nan Python yo te kreye epi yo kontinye kreye. Atik sa a dekri de nouvo bibliyotèk ki te kreye pa otè pòs sa a - entelijan-env и piton-koki - ak fèt yo soulaje devops nan bezwen nan peye anpil atansyon sou sibtilite yo nan travay ak Python, kite plas pou travay ki pi enteresan. Dimansyon aktivite bibliyotèk yo se varyab anviwònman ak lanse sèvis piblik ekstèn.

Nenpòt moun ki enterese, tanpri gade chat.

Nouvo "bisiklèt"?

Li ta sanble, poukisa kreye nouvo pakè pou operasyon san patipri òdinè? Ki sa ki anpeche w itilize os.environ ak subprocess.<metòd oswa klas ou chwazi a> dirèkteman?

Mwen pral bay prèv an favè chak bibliyotèk separeman.

bibliyotèk smart-env

Anvan ou ekri pwòp lide ou, li itil pou ale sou entènèt epi chèche solisyon pare yo. Natirèlman, gen yon risk pou pa jwenn sa ou bezwen, men sa a se pito yon "evènman asirans". Kòm yon règ, apwòch sa a travay epi sove anpil tan ak efò.

Dapre rezilta yo rechèch sa ki annapre yo te revele:

  • gen pakè ki aktyèlman vlope apèl nan os.environ, men an menm tan an mande pou yon pakèt aksyon distrè (kreye yon egzanp nan yon klas, paramèt espesyal nan apèl, elatriye);
  • Gen bon pakè, ki, sepandan, yo estrikteman mare nan yon ekosistèm espesifik (sitou kad entènèt tankou Django) ak Se poutèt sa yo pa ditou inivèsèl san yon dosye;
  • gen tantativ ra fè yon bagay nouvo. Pa egzanp, ajoute sezisman epi analize klèman valè varyab lè w rele metòd tankou
    get_<typename>(var_name)

    Oswa isit la yon lòt solisyon ankò, ki, sepandan, pa sipòte kounye a wont Python 2 (ki, malgre ofisyèl RIP, gen toujou mòn nan kòd ekri ak tout ekosistèm);

  • gen atizana elèv lekòl ki, pou kèk rezon enkoni, te fini nan en PyPI epi sèlman kreye pwoblèm ak nonmen nouvo pakè (an patikilye, non "smart-env" se yon mezi nesesè).

Ak lis sa a ka kontinye pou yon tan long. Sepandan, pwen ki anwo yo te ase pou fè m eksite sou lide pou fè yon bagay pratik ak inivèsèl.

Kondisyon ki te fikse anvan ekri smart-env:

  • Konplo itilizasyon ki pi senp
  • Sipò pou tape done fasil configurable
  • Python 2.7 konpatib
  • Bon pwoteksyon kòd pa tès yo

Finalman, tout bagay sa yo te reyalize. Men yon egzanp itilizasyon:

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

Kòm ou ka wè nan egzanp lan, pou travay ak yon nouvo klas, ou jis bezwen enpòte li (ou pa bezwen kreye yon egzanp - mwens aksyon an siplemantè). Aksè nan nenpòt varyab anviwònman reyalize lè w refere li kòm yon varyab nan klas ENV a, ki, an reyalite, fè klas sa a yon anbalaj entwisyon pou anviwònman sistèm natif natal la, pandan y ap vire l 'nan yon objè konfigirasyon posib pou prèske nenpòt sistèm ( yon apwòch menm jan an, pou egzanp, reyalize nan Django , sèlman gen objè a konfigirasyon se modil la anviwònman / pake tèt li).

Pèmèt/enfim mòd sipò otomatik sezisman an reyalize lè l sèvi avèk de metòd - enable_automatic_type_cast () ak disable_automatic_type_cast (). Sa a ka pratik si varyab anviwònman an gen yon seri objè ki sanble ak JSON oswa menm jis yon konstan Boolean (eksplisman mete varyab DEBUG la nan Django lè w konpare varyab anviwònman an ak fisèl "valid" se youn nan ka ki pi komen). Men koulye a, pa gen okenn nesesite klèman konvèti fisèl - pi fò nan aksyon ki nesesè yo deja entegre nan pwofondè yo nan bibliyotèk la epi yo jis ap tann pou yon siyal yo aji. 🙂 An jeneral, sezisman travay transparan epi sipòte prèske tout kalite done entegre ki disponib (frozenset, konplèks ak bytes pa te teste).

Egzijans pou sipòte Python 2 te aplike ak pratikman pa gen okenn sakrifis (abandon nan sezisman ak kèk nan "sirèt yo sik" nan dènye vèsyon yo nan Python 3), an patikilye gras a sis yo omniprésente (pou rezoud pwoblèm yo nan lè l sèvi avèk metaklas) .

Men, gen kèk restriksyon:

  • Sipò pou Python 3 vle di vèsyon 3.5 ak pi wo (prezans yo nan pwojè ou a se rezilta swa parès oswa mank de bezwen pou amelyorasyon, paske li difisil pou vini ak yon rezon objektif poukisa ou toujou sou 3.4);
  • Nan Python 2.7, bibliyotèk la pa sipòte deserialization nan seri literal. Deskripsyon isit la. Men, si yon moun vle aplike li, ou byen akeyi :);

Bibliyotèk la tou gen yon mekanis eksepsyon nan ka ta gen erè analiz. Si nenpòt nan analizè ki disponib yo pa t 'kapab rekonèt fisèl la, valè a rete yon fisèl (okontrè, pou rezon konvenyans ak konpatibilite bak ak lojik abityèl nan fason varyab yo travay nan Bash).

bibliyotèk python-shell

Koulye a, mwen pral di w sou dezyèm bibliyotèk la (mwen pral omisyon deskripsyon enpèfeksyon yo nan analogue ki deja egziste - li sanble ak sa ki dekri pou smart-env. Analog - isit la и isit la).

An jeneral, lide aplikasyon an ak kondisyon pou li yo sanble ak sa ki dekri pou smart-env, jan yo ka wè nan egzanp lan:

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

Lide a se sa a:

  1. Yon sèl klas ki reprezante Bash nan mond lan Python;
  2. Chak lòd Bash rele kòm yon fonksyon nan klas la Shell;
  3. Lè sa a, paramèt yo pou chak apèl fonksyon yo pase nan apèl la korespondan kòmand Bash;
  4. Chak kòmand egzekite "isit la e kounye a" nan moman sa a yo rele li, i.e. apwòch synchrone a ap travay;
  5. li posib jwenn aksè nan pwodiksyon an nan yon lòd nan stdout, osi byen ke kòd retounen li yo;
  6. Si kòmandman an pa nan sistèm lan, yo voye yon eksepsyon.

Menm jan ak smart-env, gen sipò pou Python 2 (byenke yo te mande yon ti kras plis san sakrifis) epi pa gen sipò pou Python 3.0-3.4.

Plan devlopman bibliyotèk

Ou ka itilize bibliyotèk yo kounye a: tou de yo afiche sou PyPI ofisyèl la. Sous yo disponib sou Github (gade anba a).

Tou de bibliyotèk yo pral devlope an konsiderasyon fidbak yo kolekte nan men moun ki enterese yo. Epi, si li ka difisil pou vini ak yon varyete nouvo karakteristik nan smart-env, Lè sa a, nan python-shell gen definitivman yon lòt bagay yo ajoute:

  • sipò pou apèl ki pa bloke;
  • posiblite pou kominikasyon entèaktif ak ekip la (k ap travay ak stdin);
  • ajoute nouvo pwopriyete (pa egzanp, pwopriyete pou resevwa pwodiksyon nan stderr);
  • aplikasyon yon anyè kòmandman ki disponib (pou itilize ak fonksyon dir());
  • elatriye

Referans

  1. bibliyotèk smart-env: Github и P&PI
  2. bibliyotèk python-shell: Github и P&PI
  3. Chanèl Telegram mizajou bibliyotèk yo

UPD 23.02.2020/XNUMX/XNUMX:
* Repozitwa yo te deplase, lyen korespondan yo te mete ajou
* Vèsyon python-shell==1.0.1 ap prepare pou lage sou 29.02.2020/XNUMX/XNUMX. Chanjman yo enkli sipò pou autocomplete kòmand ak kòmandman dir(Shell), kouri kòmandman ak yon idantifyan Python envalid, ak korije ensèk.

Sous: www.habr.com

Add nouvo kòmantè