Nggawe Persahabatan Python lan Bash: perpustakaan smart-env lan python-shell

Sugeng siang kanggo kabeh.

Saiki, Python minangka salah sawijining basa sing paling akeh digunakake ing lapangan nggawe ora mung produk piranti lunak dhewe, nanging uga nyedhiyakake infrastruktur. Akibaté, akeh devops, apa karsane utawa ora, kudu sinau basa anyar kanggo nggunakake mengko minangka tambahan kanggo script Bash lawas apik. Nanging, Bash lan Python ngakoni pendekatan sing beda kanggo nulis kode lan nduweni fitur tartamtu, tegese porting skrip Bash menyang "basa ula" kadhangkala dadi tugas sing jembar lan adoh saka tugas sing ora pati penting.

Kanggo nggawe urip luwih gampang kanggo devops, akeh perpustakaan migunani lan keperluan ing Python wis digawe lan terus digawe. Artikel iki nggambarake rong perpustakaan anyar sing digawe dening penulis kiriman iki - pinter-env и cangkang python - lan dirancang kanggo ngredhakaké devops saka perlu kanggo mbayar manungsa waé akèh kanggo intricacies nggarap Python, ninggalake kamar kanggo tugas liyane menarik. Ruang lingkup kegiatan perpustakaan yaiku variabel lingkungan lan ngluncurake utilitas eksternal.

Sing minat, mangga deleng kucing.

"sepeda" anyar?

Kayane, kenapa nggawe paket anyar kanggo operasi sing cukup biasa? Apa sing ngalangi sampeyan nggunakake os.environ lan subprocess.<metode utawa kelas pilihan> langsung?

Aku bakal menehi bukti kanggo saben perpustakaan kanthi kapisah.

perpustakaan pinter-env

Sadurunge nulis brainchild dhewe, iku migunani kanggo pindhah online lan golek solusi siap-digawe. Mesthi, ana risiko ora nemokake apa sing sampeyan butuhake, nanging iki minangka "acara asuransi". Minangka aturan, pendekatan iki bisa digunakake lan ngirit akeh wektu lan gaweyan.

Miturut asil nggoleki ing ngisor iki dicethakaké:

  • ana paket sing bener mbungkus telpon kanggo os.environ, nanging ing wektu sing padha mbutuhake Bunch saka tumindak distracting (nggawe Kayata kelas, paramèter khusus ing telpon, etc.);
  • Ana paket apik, kang, Nanging, strictly disambungake menyang ekosistem tartamtu (utamané frameworks web kaya Django) lan mulane ora ing kabeh universal tanpa file;
  • ana langka nyoba kanggo nindakake soko anyar. Tuladhane, nambah ngetik lan kanthi jelas ngurai nilai variabel kanthi cara nelpon kaya
    get_<typename>(var_name)

    Utawa kene siji solusi maneh, sing, Nanging, ora ndhukung Python 2 saiki disgrace (sing, senadyan resmi RIP, isih ana gunung kode sing ditulis lan kabeh ekosistem);

  • Ana kerajinan sekolah-murid sing, kanggo sawetara alasan sing ora dingerteni, rampung ing PyPI hulu lan mung nggawe masalah karo jeneng paket anyar (utamane, jeneng "smart-env" minangka ukuran sing perlu).

Lan dhaftar iki bisa kanggo dangu. Nanging, poin ing ndhuwur cukup kanggo nggawe aku bungah babagan ide nggawe sing trep lan universal.

Persyaratan sing disetel sadurunge nulis smart-env:

  • Skema panggunaan sing paling gampang
  • Dhukungan ngetik data sing gampang dikonfigurasi
  • Python 2.7 kompatibel
  • Jangkoan kode apik kanthi tes

Pungkasane, kabeh iki diwujudake. Punika conto panggunaan:

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

Kaya sing sampeyan ngerteni saka conto, kanggo nggarap kelas anyar, sampeyan mung kudu ngimpor (sampeyan ora perlu nggawe conto - minus tumindak ekstra). Akses menyang variabel lingkungan apa wae digayuh kanthi nyebutake minangka variabel kelas ENV, sing, nyatane, ndadekake kelas iki minangka pambungkus intuisi kanggo lingkungan sistem asli, nalika bebarengan ngowahi dadi obyek konfigurasi sing bisa kanggo meh kabeh sistem ( pendekatan padha, contone, ngrambah ing Django, mung ana obyek konfigurasi punika modul setelan / paket dhewe).

Ngaktifake / mateni mode dhukungan ngetik otomatis digayuh nggunakake rong cara - enable_automatic_type_cast () lan disable_automatic_type_cast (). Iki bisa dadi trep yen variabel lingkungan ngemot obyek kaya JSON serialized utawa malah mung konstanta Boolean (kanthi jelas nyetel variabel DEBUG ing Django kanthi mbandhingake variabel lingkungan karo strings "valid" minangka salah sawijining kasus sing paling umum). Nanging saiki ora perlu ngonversi senar kanthi jelas - umume tumindak sing dibutuhake wis dipasang ing jero perpustakaan lan mung ngenteni sinyal kanggo tumindak. 🙂 Umumé, ngetik bisa transparan lan ndhukung meh kabeh kasedhiya dibangun ing jinis data (frozenset, Komplek lan bita padha ora dites).

Keperluan kanggo ndhukung Python 2 dileksanakake kanthi meh ora ana pengorbanan (nglirwakake ngetik lan sawetara "permen gula" saka versi paling anyar saka Python 3), utamane, amarga enem sing ana ing ngendi wae (kanggo ngatasi masalah nggunakake metaclasses). ).

Nanging ana sawetara watesan:

  • Dhukungan Python 3 tegese versi 3.5 lan luwih dhuwur (sing ana ing proyek sampeyan minangka asil saka kesed utawa ora butuh dandan, amarga angel nggawe alesan objektif kenapa sampeyan isih ana ing 3.4);
  • Ing Python 2.7, perpustakaan ora ndhukung deserialization saka set literals. Katrangan kene. Nanging yen ana sing pengin ngleksanakake, muga-muga :);

Pustaka uga duwe mekanisme pangecualian ing kasus kesalahan parsing. Yen senar ora bisa diakoni dening analisa sing kasedhiya, nilai kasebut tetep dadi senar (dadi, amarga kepenak lan kompatibilitas mundur karo logika biasa babagan cara variabel bisa digunakake ing Bash).

perpustakaan python-shell

Saiki aku bakal pitutur marang kowe babagan perpustakaan kapindho (aku bakal ngilangi katrangan babagan kekurangan analog sing ana - padha karo sing diterangake kanggo smart-env. Analogs - kene и kene).

Umumé, gagasan implementasine lan syarat kasebut padha karo sing diterangake kanggo smart-env, kaya sing bisa dideleng saka conto:

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

Ide iki:

  1. Kelas siji sing makili Bash ing donya Python;
  2. Saben printah Bash diarani minangka fungsi saka kelas Shell;
  3. Parameter kanggo saben telpon fungsi banjur diterusake menyang telpon printah Bash sing cocog;
  4. Saben printah dieksekusi "kene lan saiki" ing wayahe diarani, i.e. pendekatan sinkron dianggo;
  5. bisa ngakses output printah ing stdout, uga kode bali;
  6. Yen prentah ora ana ing sistem, pangecualian dibuwang.

Karo pinter-env, ana support kanggo Python 2 (sanajan sethitik liyane getih kurban dibutuhake) lan ora support kanggo Python 3.0-3.4.

Rencana pangembangan perpustakaan

Sampeyan bisa nggunakake perpustakaan saiki: loro-lorone dikirim ing PyPI resmi. Sumber kasedhiya ing Github (ndeleng ngisor).

Loro-lorone perpustakaan bakal dikembangake kanthi njupuk umpan balik sing diklumpukake saka wong sing kasengsem. Lan, yen bisa uga angel nggawe macem-macem fitur anyar ing smart-env, banjur ing python-shell mesthi ana sing bisa ditambahake:

  • dhukungan kanggo telpon non-blocking;
  • kamungkinan komunikasi interaktif karo tim (makarya karo stdin);
  • nambah properti anyar (contone, properti kanggo nampa output saka stderr);
  • implementasine saka direktori printah kasedhiya (kanggo nggunakake fungsi dir ());
  • lan liya-liyane.

referensi

  1. perpustakaan smart-env: GitHub и PyPI
  2. perpustakaan python-shell: GitHub и PyPI
  3. Saluran Telegram nganyari perpustakaan

UPD23.02.2020:
* Repositori wis dipindhah, pranala sing cocog wis dianyari
* Versi python-shell == 1.0.1 lagi disiapake kanggo release ing 29.02.2020/XNUMX/XNUMX. Owah-owahan kalebu dhukungan kanggo printah autocomplete lan printah dir(Shell), printah sing nganggo pengenal Python sing ora bener, lan ndandani bug.

Source: www.habr.com

Add a comment