Python és Bash barátság létrehozása: smart-env és python-shell könyvtárak

Jó napot mindenkinek.

Ma a Python az egyik leggyakrabban használt nyelv nemcsak a szoftvertermékek létrehozása, hanem az infrastruktúra biztosítása terén is. Ennek eredményeként sok devopnak – akár akaratából, akár ellene – új nyelvet kellett tanulnia, hogy később a régi jó Bash-szkriptek kiegészítéseként használhassa. A Bash és a Python azonban eltérő megközelítéseket vall a kódíráshoz, és rendelkeznek bizonyos jellemzőkkel, ami azt jelenti, hogy a Bash-szkriptek „kígyónyelvre” történő áthelyezése néha nagy kapacitású és korántsem triviális feladatnak bizonyul.

A devopok életének megkönnyítése érdekében a Pythonban számos hasznos könyvtárat és segédprogramot hoztak létre és hoznak létre továbbra is. Ez a cikk a bejegyzés szerzője által létrehozott két új könyvtárat ismerteti - smart-env и python-shell - és úgy lett kialakítva, hogy mentesítse a devopsokat attól, hogy nagy figyelmet fordítsanak a Pythonnal való munkavégzés bonyolultságára, teret engedve az érdekesebb feladatoknak. A könyvtárak tevékenységi köre a környezeti változók és külső segédprogramok indítása.

Akit érdekel, nézze meg a macskát.

Új "kerékpárok"?

Úgy tűnik, miért kell új csomagokat létrehozni a meglehetősen hétköznapi műveletekhez? Mi akadályozza meg az os.environ és a subprocess.<method or class> általad választott közvetlen használatát?

Az egyes könyvtárak javára külön-külön fogok bizonyítékot szolgáltatni.

smart-env könyvtár

Mielőtt megírná a saját ötletét, érdemes felkeresni a netet, és kész megoldásokat keresni. Természetesen fennáll annak a veszélye, hogy nem találja meg, amire szüksége van, de ez inkább „biztosítási esemény”. Általános szabály, hogy ez a megközelítés működik, és sok időt és erőfeszítést takarít meg.

Az eredmények szerint kutató a következők derültek ki:

  • vannak olyan csomagok, amelyek ténylegesen becsomagolják az os.environ hívásait, de ugyanakkor egy csomó zavaró műveletet igényelnek (egy osztály példányának létrehozása, speciális paraméterek a hívásokban stb.);
  • Vannak jó csomagok, amelyek azonban szigorúan egy adott ökoszisztémához kötődnek (főleg a webes keretrendszerekhez, mint a Django), ezért egyáltalán nem univerzálisak fájl nélkül;
  • ritkán próbálkoznak valami újjal. Például, gépelés hozzáadása és explicit módon elemzi a változó értékeket olyan metódusok meghívásával, mint pl
    get_<typename>(var_name)

    Vagy itt még egy megoldás, amely azonban nem támogatja a most megszégyenült Python 2-t (ami annak ellenére hivatalos RIP, még mindig vannak írott kódok hegyei és egész ökoszisztémák);

  • Vannak olyan iskolai tanulói kézműves termékek, amelyek ismeretlen okból az upstream PyPI-be kerültek, és csak az új csomagok elnevezésével okoznak problémákat (különösen a „smart-env” név szükséges intézkedés).

És ez a lista még sokáig folytatható. A fenti pontok azonban elegendőek voltak ahhoz, hogy fellelkesítsen valami kényelmes és univerzális megoldást.

A smart-env írása előtt beállított követelmények:

  • A legegyszerűbb használati séma
  • Könnyen konfigurálható adatbeviteli támogatás
  • Python 2.7 kompatibilis
  • Jó kódlefedettség tesztekkel

Végül mindez megvalósult. Íme egy példa a felhasználásra:

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

Amint a példából látható, egy új osztállyal való munkavégzéshez csak importálnia kell azt (nem kell példányt létrehoznia - leszámítva az extra műveletet). Bármely környezeti változóhoz való hozzáférést úgy érhetjük el, hogy az ENV osztály változójaként hivatkozunk rá, ami valójában ezt az osztályt a natív rendszerkörnyezet intuitív burkolójává teszi, miközben egyidejűleg szinte bármilyen rendszer lehetséges konfigurációs objektumává alakítja ( hasonló megközelítés például a Django-ban érhető el, csak ott a konfigurációs objektum maga a beállítási modul/csomag).

Az automatikus gépelés támogatási mód engedélyezése/letiltása két módszerrel érhető el - enable_automatic_type_cast() és disable_automatic_type_cast(). Ez kényelmes lehet, ha a környezeti változó szerializált JSON-szerű objektumot vagy akár csak logikai konstanst tartalmaz (az egyik leggyakoribb eset a DEBUG változó explicit beállítása a Django-ban a környezeti változó „érvényes” karakterláncokkal való összehasonlításával). De most már nincs szükség a karakterláncok kifejezetten konvertálására - a szükséges műveletek nagy része már be van ágyazva a könyvtár mélyébe, és csak a cselekvés jelére várnak. 🙂 Általánosságban elmondható, hogy a gépelés átláthatóan működik, és szinte az összes rendelkezésre álló beépített adattípust támogatja (fagyott, komplex és bájtok nem lettek tesztelve).

A Python 2 támogatásának követelménye gyakorlatilag áldozatok nélkül valósult meg (a gépelés elhagyása és a Python 3 legújabb verzióinak néhány „cukros cukorkája”), különösen a mindenütt jelenlévő hatnak köszönhetően (a metaosztályok használatának problémáinak megoldása érdekében) .

De van néhány korlátozás:

  • A Python 3 támogatása a 3.5-ös és újabb verziókat jelenti (a projektben való jelenlétük a lustaság vagy a fejlesztési igény hiánya eredménye, mivel nehéz objektív okot találni arra, hogy miért még mindig a 3.4-et használja);
  • A Python 2.7-ben a könyvtár nem támogatja a beállított literálok deszerializálását. Leírás itt. De ha valaki meg akarja valósítani, szívesen látjuk :);

A könyvtárnak van kivétel mechanizmusa is az elemzési hibák esetére. Ha a karakterláncot egyik elérhető elemző sem ismeri fel, az érték karakterlánc marad (inkább a kényelem és a Bash változók működésének szokásos logikájával való visszamenőleges kompatibilitás miatt).

python-shell könyvtár

Most a második könyvtárról fogok beszélni (elhagyom a meglévő analógok hiányosságainak leírását - hasonló a smart-env. Analogues esetében leírtakhoz - itt и itt).

Általánosságban elmondható, hogy a megvalósítás ötlete és a rá vonatkozó követelmények hasonlóak a smart-env esetében leírtakhoz, amint az a példából is látható:

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

Az ötlet a következő:

  1. Egyetlen osztály, amely a Bash-t képviseli a Python világban;
  2. Minden Bash parancs a Shell osztály függvényeként kerül meghívásra;
  3. Az egyes függvényhívások paraméterei ezután átkerülnek a megfelelő Bash parancshívásba;
  4. Minden parancs „itt és most” végrehajtásra kerül a hívás pillanatában, azaz. a szinkron megközelítés működik;
  5. stdout-ban lehet elérni egy parancs kimenetét, valamint a visszatérési kódját;
  6. Ha a parancs nincs a rendszerben, kivételt dob ​​a rendszer.

A smart-env-hez hasonlóan a Python 2 is támogatja (bár egy kis áldozati vér kellett), a Python 3.0-3.4 pedig nem.

Könyvtárfejlesztési tervek

Most már használhatja a könyvtárakat: mindkettő megtalálható a hivatalos PyPI-n. A források elérhetők a Githubon (lásd alább).

Mindkét könyvtár fejlesztése az érdeklődőktől begyűjtött visszajelzések figyelembevételével történik. És ha nehéz lehet számos új funkcióval előállni a smart-env-ben, akkor a python-shellben mindenképpen van még valami, amit hozzá kell adni:

  • a nem blokkoló hívások támogatása;
  • interaktív kommunikáció lehetősége a csapattal (stdin-nel való munka);
  • új tulajdonságok hozzáadása (például tulajdonság az stderr kimenetének fogadására);
  • elérhető parancsok könyvtárának megvalósítása (a dir() függvénnyel való használatra);
  • stb

referenciák

  1. smart-env könyvtár: GitHub и PyPI
  2. python-shell könyvtár: GitHub и PyPI
  3. Telegram csatorna könyvtári frissítések

UPD23.02.2020:
* A tárolók áthelyezésre kerültek, a megfelelő hivatkozások frissültek
* A python-shell==1.0.1 verzió 29.02.2020-i kiadásra készül. A változtatások közé tartozik az automatikus kiegészítés és a dir(Shell) parancs támogatása, az érvénytelen Python-azonosítóval rendelkező parancsok futtatása, valamint a hibajavítások.

Forrás: will.com

Hozzászólás