Farante Python kaj Bash Friendship: smart-env kaj python-shell bibliotekoj

Bonan tagon al ĉiuj.

Hodiaŭ, Python estas unu el la plej uzataj lingvoj en la kampo de krei ne nur programajn produktojn mem, sed ankaŭ provizi ilian infrastrukturon. Kiel rezulto, multaj devopoj, ĉu laŭ sia volo aŭ kontraŭ ĝi, devis lerni novan lingvon por poste uzi kiel suplemento al la bonaj malnovaj Bash-skriptoj. Tamen, Bash kaj Python konfesas malsamajn alirojn por skribi kodon kaj havas certajn funkciojn, kio signifas, ke porti Bash-skriptojn al la "serpenta lingvo" foje montriĝas ampleksa kaj malproksime de bagatela tasko.

Por faciligi la vivon al devopoj, multaj utilaj bibliotekoj kaj utilecoj en Python estis kreitaj kaj daŭre kreiĝas. Ĉi tiu artikolo priskribas du novajn bibliotekojn kreitajn de la aŭtoro de ĉi tiu afiŝo - smart-env и python-ŝelo - kaj desegnita por malpezigi devopojn de la bezono pagi multe da atento al la komplikaĵoj de labori kun Python, lasante lokon por pli interesaj taskoj. La amplekso de agado de bibliotekoj estas mediovariabloj kaj lanĉado de eksteraj utilecoj.

Kiu ajn interesiĝas, bonvolu vidi katon.

Novaj "bicikloj"?

Ŝajnus, kial krei novajn pakaĵojn por sufiĉe ordinaraj operacioj? Kio malhelpas vin uzi os.environ kaj subprocess.<metodo aŭ klaso de via elekto> rekte?

Mi provizos pruvojn favore al ĉiu el la bibliotekoj aparte.

smart-env biblioteko

Antaŭ ol verki vian propran ideon, estas utile iri interrete kaj serĉi pretajn solvojn. Kompreneble, estas risko ne trovi tion, kion vi bezonas, sed ĉi tio estas prefere "asekura evento". Kiel regulo, ĉi tiu aliro funkcias kaj ŝparas multan tempon kaj penadon.

Laŭ la rezultoj serĉi la sekvanta estis rivelita:

  • ekzistas pakaĵoj kiuj efektive envolvas vokojn al os.environ, sed samtempe postulas amason da distraj agoj (kreado de ekzemplo de klaso, specialaj parametroj en vokoj, ktp.);
  • Estas bonaj pakaĵoj, kiuj tamen estas strikte ligitaj al specifa ekosistemo (ĉefe retaj kadroj kiel Django) kaj tial tute ne estas universalaj sen dosiero;
  • estas maloftaj provoj fari ion novan. Ekzemple, aldoni tajpadon kaj eksplicite analizu variajn valorojn vokante metodojn kiel
    get_<typename>(var_name)

    Aŭ ĉi tie unu plia solvo, kiu tamen ne subtenas la nun malhonoritan Python 2 (kiu, malgraŭ oficiala RIP, estas ankoraŭ montoj de skribita kodo kaj tutaj ekosistemoj);

  • ekzistas lernej-lernantaj metioj, kiuj pro iu nekonata kialo finiĝis en kontraŭflua PyPI kaj nur kreas problemojn kun la nomado de novaj pakaĵoj (precipe, la nomo "smart-env" estas necesa mezuro).

Kaj ĉi tiu listo povas daŭri longe. Tamen la supraj punktoj sufiĉis por eksciti min pri la ideo fari ion oportunan kaj universalan.

Postuloj kiuj estis fiksitaj antaŭ skribi smart-env:

  • La plej simpla uzadoskemo
  • Facile agordebla subteno de tajpado de datumoj
  • Python 2.7 kongrua
  • Bona koda kovrado per testoj

Finfine, ĉio ĉi estis realigita. Jen ekzemplo de uzo:

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

Kiel vi povas vidi el la ekzemplo, por labori kun nova klaso, vi nur bezonas importi ĝin (vi ne bezonas krei ekzemplon - minus la kroman agon). Aliro al iu ajn mediovariablo estas atingita nomante ĝin kiel variablo de la ENV-klaso, kiu, fakte, igas tiun klason intuicia envolvaĵo por la denaska sistema medio, samtempe igante ĝin ebla agorda objekto por preskaŭ ajna sistemo ( simila aliro, ekzemple, estas atingita en Django , nur tie la agorda objekto estas la agorda modulo/pako mem).

Ebligi/malŝalti la aŭtomatan tajpan subtenan reĝimon estas atingita per du metodoj - enable_automatic_type_cast() kaj disable_automatic_type_cast(). Ĉi tio povas esti oportuna se la mediovariablo enhavas seriigitan JSON-similan objekton aŭ eĉ nur Bulea konstanto (eksplicite fiksi la DEBUG-variablon en Django komparante la mediovariablon kun "validaj" ŝnuroj estas unu el la plej oftaj kazoj). Sed nun ne necesas eksplicite konverti ŝnurojn - la plej multaj el la necesaj agoj jam estas enigitaj en la profundon de la biblioteko kaj nur atendas signalon por agi. 🙂 Ĝenerale, tajpado funkcias travideble kaj subtenas preskaŭ ĉiujn disponeblajn enkonstruitajn datumtipojn (frostaj, kompleksaj kaj bajtoj ne estis provitaj).

La postulo subteni Python 2 estis efektivigita kun preskaŭ neniuj oferoj (la forlaso de tajpado kaj kelkaj el la "sukerbonaĵoj" de la plej novaj versioj de Python 3), precipe, danke al la ĉiea ses (por solvi la problemojn de uzado de metaklasoj). ).

Sed estas iuj limigoj:

  • Subteno de Python 3 signifas version 3.5 kaj pli altan (ilia ĉeesto en via projekto estas rezulto de aŭ maldiligento aŭ manko de bezono de plibonigoj, ĉar estas malfacile elpensi objektivan kialon, kial vi ankoraŭ estas sur 3.4);
  • En Python 2.7, la biblioteko ne subtenas deseriigon de aro-literaĵoj. Priskribo tie. Sed se iu volas efektivigi ĝin, vi estas bonvena :);

La biblioteko ankaŭ havas esceptan mekanismon en kazo de analizaj eraroj. Se la ĉeno ne povus esti rekonita de iu ajn el la disponeblaj analiziloj, la valoro restas ĉeno (prefere, pro kialoj de oportuno kaj retrokongruo kun la kutima logiko de kiel variabloj funkcias en Bash).

python-shell biblioteko

Nun mi rakontos al vi pri la dua biblioteko (mi preterlasos la priskribon de la mankoj de la ekzistantaj analogoj - ĝi similas al tiu priskribita por smart-env. Analogoj - tie и tie).

Ĝenerale, la ideo de efektivigo kaj la postuloj por ĝi estas similaj al tiuj priskribitaj por smart-env, kiel videblas el la ekzemplo:

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

La ideo estas jena:

  1. Ununura klaso kiu reprezentas Bash en la Python-mondo;
  2. Ĉiu Bash-komando estas vokita kiel funkcio de la Shell-klaso;
  3. La parametroj por ĉiu funkciovoko tiam estas pasitaj en la respondan komandvokon de Bash;
  4. Ĉiu komando estas ekzekutita "ĉi tie kaj nun" en la momento, kiam ĝi estas vokita, t.e. la sinkrona aliro funkcias;
  5. eblas aliri la eligon de komando en stdout, same kiel ĝian revenkodon;
  6. Se la komando ne estas en la sistemo, escepto estas ĵetita.

Kiel ĉe smart-env, ekzistas subteno por Python 2 (kvankam iom pli da ofera sango estis bezonata) kaj neniu subteno por Python 3.0-3.4.

Bibliotekaj evoluplanoj

Vi povas uzi la bibliotekojn nun: ambaŭ estas afiŝitaj sur la oficiala PyPI. Fontoj haveblas ĉe Github (vidu sube).

Ambaŭ bibliotekoj estos evoluigitaj konsiderante komentojn kolektitajn de interesitoj. Kaj, se eble estos malfacile elpensi diversajn novajn funkciojn en smart-env, tiam en python-shell certe estas io alia por aldoni:

  • subteno por ne-blokaj vokoj;
  • ebleco de interaga komunikado kun la teamo (laborante kun stdin);
  • aldonante novajn ecojn (ekzemple, posedaĵon por ricevi eligon de stderr);
  • efektivigo de dosierujo de disponeblaj komandoj (por uzo kun la funkcio dir());
  • kaj tiel plu.

referencoj

  1. smart-env biblioteko: GitHub и PyPI
  2. python-shell biblioteko: GitHub и PyPI
  3. Telegram-kanalo bibliotekaj ĝisdatigoj

UPD 23.02.2020/XNUMX/XNUMX:
* Deponejoj estis movitaj, respondaj ligiloj estis ĝisdatigitaj
* Versio python-shell==1.0.1 estas preta por liberigo la 29.02.2020/XNUMX/XNUMX. Ŝanĝoj inkluzivas subtenon por aŭtokompleto de komando kaj la komando dir(Shell), ruli komandojn kun nevalida Python-identigilo kaj korektoj de cimoj.

fonto: www.habr.com

Aldoni komenton