Paggawa ng Python at Bash Friendship: smart-env at python-shell library

Magandang araw sa inyong lahat.

Ngayon, ang Python ay isa sa mga pinaka ginagamit na wika sa larangan ng paglikha hindi lamang ng mga produkto ng software mismo, kundi pati na rin ang pagbibigay ng kanilang imprastraktura. Bilang resulta, maraming devops, sa kanilang sariling kagustuhan o laban dito, ang kailangang matuto ng bagong wika para magamit sa ibang pagkakataon bilang karagdagan sa magagandang lumang mga script ng Bash. Gayunpaman, ang Bash at Python ay nagpapahayag ng iba't ibang mga diskarte sa pagsulat ng code at may ilang partikular na mga tampok, ibig sabihin, ang pag-port ng mga script ng Bash sa "wika ng ahas" kung minsan ay lumalabas na isang malawak at malayo sa maliit na gawain.

Upang gawing mas madali ang buhay para sa mga devops, maraming kapaki-pakinabang na aklatan at kagamitan sa Python ang ginawa at patuloy na ginagawa. Inilalarawan ng artikulong ito ang dalawang bagong aklatan na ginawa ng may-akda ng post na ito - matalino-env ΠΈ python-shell - at idinisenyo upang mapawi ang mga devops mula sa pangangailangan na magbayad ng maraming pansin sa mga salimuot ng pagtatrabaho sa Python, na nag-iiwan ng puwang para sa mas kawili-wiling mga gawain. Ang saklaw ng aktibidad ng mga aklatan ay mga variable ng kapaligiran at paglulunsad ng mga panlabas na kagamitan.

Sinumang interesado, mangyaring tingnan ang pusa.

Bagong "mga bisikleta"?

Tila, bakit lumikha ng mga bagong pakete para sa medyo ordinaryong operasyon? Ano ang pumipigil sa iyo mula sa paggamit ng os.environ at subprocess.<paraan o klase na iyong pinili> nang direkta?

Magbibigay ako ng ebidensya na pabor sa bawat aklatan nang hiwalay.

smart-env library

Bago isulat ang iyong sariling ideya, kapaki-pakinabang na mag-online at maghanap ng mga handa na solusyon. Siyempre, may panganib na hindi mahanap ang kailangan mo, ngunit ito ay isang "kaganapan ng seguro". Bilang isang patakaran, ang diskarte na ito ay gumagana at nakakatipid ng maraming oras at pagsisikap.

Ayon sa mga resulta maghanap ang mga sumusunod ay nahayag:

  • may mga pakete na talagang bumabalot ng mga tawag sa os.environ, ngunit sa parehong oras ay nangangailangan ng isang grupo ng mga nakakagambalang aksyon (paglikha ng isang halimbawa ng isang klase, mga espesyal na parameter sa mga tawag, atbp.);
  • Mayroong magagandang pakete, na, gayunpaman, ay mahigpit na nakatali sa isang partikular na ecosystem (pangunahin ang mga web framework tulad ng Django) at samakatuwid ay hindi pangkalahatan nang walang file;
  • may mga bihirang pagtatangka na gumawa ng bago. Halimbawa, magdagdag ng pag-type at tahasang i-parse ang mga variable na halaga sa pamamagitan ng pagtawag sa mga pamamaraan tulad ng
    get_<typename>(var_name)

    O dito isa pang solusyon, na, gayunpaman, ay hindi sumusuporta sa ngayon ay kahihiyan na Python 2 (na, sa kabila opisyal na RIP, may mga bundok pa rin ng nakasulat na code at buong ecosystem);

  • May mga gawaing pang-eskwela-estudyante na, sa hindi malamang dahilan, napunta sa upstream na PyPI at lumilikha lamang ng mga problema sa pagpapangalan ng mga bagong pakete (sa partikular, ang pangalang "smart-env" ay isang kinakailangang panukala).

At ang listahang ito ay maaaring magpatuloy nang mahabang panahon. Gayunpaman, ang mga punto sa itaas ay sapat na upang matuwa ako tungkol sa ideya ng paggawa ng isang bagay na maginhawa at unibersal.

Mga kinakailangan na itinakda bago sumulat ng smart-env:

  • Ang pinakasimpleng scheme ng paggamit
  • Madaling i-configure ang suporta sa pagta-type ng data
  • Katugma sa Python 2.7
  • Magandang saklaw ng code sa pamamagitan ng mga pagsubok

Sa huli, ang lahat ng ito ay natanto. Narito ang isang halimbawa ng paggamit:

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

Tulad ng nakikita mo mula sa halimbawa, upang gumana sa isang bagong klase, kailangan mo lamang itong i-import (hindi mo kailangang lumikha ng isang instance - ibinawas ang karagdagang pagkilos). Ang pag-access sa anumang variable ng kapaligiran ay nakakamit sa pamamagitan ng pagtukoy dito bilang isang variable ng klase ng ENV, na, sa katunayan, ay ginagawa ang klase na ito na isang intuitive wrapper para sa native system environment, habang sabay-sabay na ginagawa itong isang posibleng configuration object para sa halos anumang system ( isang katulad na diskarte, halimbawa, ay nakamit sa Django , doon lamang ang configuration object ay ang setting module/package mismo).

Ang pagpapagana/hindi pagpapagana sa mode ng suporta sa awtomatikong pagta-type ay nakakamit gamit ang dalawang paraan - enable_automatic_type_cast() at disable_automatic_type_cast(). Ito ay maaaring maging maginhawa kung ang environment variable ay naglalaman ng isang serialized na JSON-like object o kahit na isang Boolean constant lang (ang tahasang pagtatakda ng DEBUG variable sa Django sa pamamagitan ng paghahambing ng environment variable sa "valid" na mga string ay isa sa mga pinakakaraniwang kaso). Ngunit ngayon ay hindi na kailangang tahasang i-convert ang mga string - karamihan sa mga kinakailangang aksyon ay naka-embed na sa kailaliman ng library at naghihintay na lamang ng signal para kumilos. πŸ™‚ Sa pangkalahatan, malinaw na gumagana ang pag-type at sinusuportahan ang halos lahat ng available na built-in na uri ng data (hindi nasubok ang frozenset, complex at bytes).

Ang kinakailangan upang suportahan ang Python 2 ay ipinatupad nang halos walang sakripisyo (ang pag-abandona sa pag-type at ilan sa mga "sugar candies" ng mga pinakabagong bersyon ng Python 3), sa partikular, salamat sa ubiquitous anim (upang malutas ang mga problema sa paggamit ng metaclasses ).

Ngunit may ilang mga paghihigpit:

  • Ang suporta sa Python 3 ay nangangahulugang bersyon 3.5 at mas mataas (ang kanilang presensya sa iyong proyekto ay resulta ng alinman sa katamaran o kakulangan ng pangangailangan para sa mga pagpapabuti, dahil mahirap na magkaroon ng isang layunin na dahilan kung bakit ikaw ay nasa 3.4 pa rin);
  • Sa Python 2.7, hindi sinusuportahan ng library ang deserialization ng mga set literal. Paglalarawan dito. Pero kung may gustong ipatupad ito, you are welcome :);

Ang library ay mayroon ding mekanismo ng pagbubukod kung sakaling magkaroon ng mga error sa pag-parse. Kung ang string ay hindi makilala ng alinman sa mga available na analyzer, ang value ay nananatiling isang string (sa halip, para sa mga dahilan ng kaginhawahan at pabalik na compatibility sa karaniwang logic kung paano gumagana ang mga variable sa Bash).

library ng python-shell

Ngayon sasabihin ko sa iyo ang tungkol sa pangalawang aklatan (aalisin ko ang paglalarawan ng mga pagkukulang ng mga umiiral na analogue - ito ay katulad ng inilarawan para sa smart-env. Analogues - dito ΠΈ dito).

Sa pangkalahatan, ang ideya ng pagpapatupad at ang mga kinakailangan para dito ay katulad ng inilarawan para sa smart-env, tulad ng makikita mula sa halimbawa:

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

Ang ideya ay ito:

  1. Isang solong klase na kumakatawan sa Bash sa mundo ng Python;
  2. Ang bawat Bash command ay tinatawag bilang function ng Shell class;
  3. Ang mga parameter para sa bawat function na tawag ay ipinapasa sa kaukulang Bash command call;
  4. Ang bawat utos ay isinasagawa "dito at ngayon" sa sandaling ito ay tinatawag, i.e. gumagana ang magkasabay na diskarte;
  5. posibleng ma-access ang output ng isang command sa stdout, pati na rin ang return code nito;
  6. Kung ang utos ay wala sa system, ang isang pagbubukod ay itinapon.

Tulad ng sa smart-env, mayroong suporta para sa Python 2 (bagaman kailangan ng kaunti pang sakripisyong dugo) at walang suporta para sa Python 3.0-3.4.

Mga plano sa pagpapaunlad ng aklatan

Magagamit mo na ang mga aklatan: parehong naka-post sa opisyal na PyPI. Ang mga mapagkukunan ay magagamit sa Github (tingnan sa ibaba).

Ang parehong mga aklatan ay bubuuin na isinasaalang-alang ang feedback na nakolekta mula sa mga interesado. At, kung maaaring mahirap na magkaroon ng iba't ibang mga bagong tampok sa smart-env, kung gayon sa python-shell ay tiyak na may iba pang idadagdag:

  • suporta para sa hindi pagharang ng mga tawag;
  • posibilidad ng interactive na komunikasyon sa koponan (nagtatrabaho sa stdin);
  • pagdaragdag ng mga bagong katangian (halimbawa, pag-aari upang makatanggap ng output mula sa stderr);
  • pagpapatupad ng isang direktoryo ng magagamit na mga utos (para magamit sa dir() function);
  • at iba pa

sanggunian

  1. smart-env library: Github ΠΈ PyPI
  2. library ng python-shell: Github ΠΈ PyPI
  3. Telegram channel mga update sa library

UPD 23.02.2020/XNUMX/XNUMX:
* Inilipat ang mga repositoryo, na-update ang mga kaukulang link
* Ang bersyon na python-shell==1.0.1 ay inihahanda para sa paglabas sa 29.02.2020/XNUMX/XNUMX. Kasama sa mga pagbabago ang suporta para sa command autocomplete at ang dir(Shell) command, pagpapatakbo ng mga command na may di-wastong Python identifier, at pag-aayos ng bug.

Pinagmulan: www.habr.com

Magdagdag ng komento