Ngadamel Persahabatan Python sareng Bash: perpustakaan pinter-env sareng python-cangkang

Wilujeng siang sadayana.

Kiwari, Python mangrupikeun salah sahiji basa anu paling sering dianggo dina widang nyiptakeun sanés ngan ukur produk parangkat lunak sorangan, tapi ogé nyayogikeun infrastrukturna. Hasilna, loba devops, naha ku kahayang maranéhanana atawa ngalawan eta, kapaksa diajar basa anyar pikeun pamakéan engké salaku suplement kana Aksara Bash heubeul alus. Nanging, Bash sareng Python ngaku pendekatan anu béda pikeun nyerat kode sareng gaduh fitur-fitur anu tangtu, hartosna yén porting skrip Bash kana "basa oray" kadang-kadang tétéla janten tugas anu ageung sareng tebih tina tugas anu sepele.

Pikeun nyieun hirup leuwih gampang pikeun devops, loba perpustakaan mangpaat tur utilitas di Python geus dijieun tur terus dijieun. Tulisan ieu ngajelaskeun dua perpustakaan anyar anu diciptakeun ku panulis tulisan ieu - pinter-env и cangkang python - sarta dirancang pikeun ngagentos devops ti kudu mayar loba perhatian ka intricacies gawé bareng Python, ninggalkeun rohangan pikeun tugas leuwih metot. Ruang lingkup kagiatan perpustakaan nyaéta variabel lingkungan sareng ngaluncurkeun utilitas éksternal.

Bilih aya nu minat mangga tingali ucing.

Anyar "sapédah"?

Éta sigana, naha nyiptakeun bungkusan énggal pikeun operasi anu cukup biasa? Naon anu nyegah anjeun ngagunakeun os.environ sareng subprocess.<metode atanapi kelas pilihan anjeun> langsung?

Kuring baris nyadiakeun bukti dina kahadean unggal perpustakaan misah.

perpustakaan pinter-env

Saméméh nulis gagasan sorangan, éta mangpaat pikeun buka online tur néangan solusi siap-dijieun. Tangtu, aya résiko teu manggihan naon nu peryogi, tapi ieu rada "acara asuransi". Sakumaha aturan, pendekatan ieu tiasa dianggo sareng ngahémat waktos sareng usaha.

Numutkeun kana hasilna milarian ieu diungkabkeun:

  • aya bungkusan nu sabenerna mungkus nelepon ka os.environ, tapi dina waktos anu sareng merlukeun kebat lampah distracting (nyieun hiji conto kelas hiji, parameter husus dina nelepon, jsb);
  • Aya bungkusan alus, nu kitu, mastikeun dihijikeun ka ékosistem husus (utamana frameworks web kawas Django) sahingga teu sakabehna universal tanpa file;
  • aya langka usaha pikeun ngalakukeun hal anyar. Salaku conto, tambahkeun ngetik sareng sacara eksplisit parse nilai variabel ku cara nyauran metode sapertos
    get_<typename>(var_name)

    Atawa di dieu hiji deui solusi, anu kitu, henteu ngadukung Python 2 anu ayeuna dihinakeun (anu, sanaos RIP resmi, masih aya gunung kodeu tinulis jeung sakabéh ékosistem);

  • Aya karajinan sakola-murid anu, pikeun sababaraha alesan kanyahoan, réngsé nepi di hulu PyPI sarta ngan nyieun masalah jeung ngaran pakét anyar (hususna, nami "pinter-env" mangrupakeun ukuran perlu).

Sareng daptar ieu tiasa diteruskeun kanggo waktos anu lami. Nanging, poin-poin di luhur cekap pikeun kuring bungah ngeunaan ideu pikeun ngajantenkeun hal anu merenah sareng universal.

Sarat anu disetél sateuacan nyerat smart-env:

  • Skéma pamakéan paling basajan
  • Pangrojong ngetik data anu gampang dikonfigurasi
  • Python 2.7 cocog
  • sinyalna kode alus ku tés

Pamustunganana, sadaya ieu direalisasikeun. Ieu conto pamakean:

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

Sakumaha anjeun tiasa tingali tina conto, pikeun damel sareng kelas énggal, anjeun ngan ukur kedah ngimpor éta (anjeun henteu kedah nyiptakeun conto - dikurangan tindakan tambahan). Aksés ka sagala variabel lingkungan kahontal ku ngarujuk kana éta salaku variabel kelas ENV, nu, kanyataanna, ngajadikeun kelas ieu wrapper intuitif pikeun lingkungan sistem asli, bari sakaligus ngarobahna kana objék konfigurasi mungkin pikeun ampir sagala sistem ( pendekatan sarupa, contona, kahontal dina Django, ngan aya obyék konfigurasi nyaéta modul setelan / bungkusan sorangan).

Aktipkeun / nganonaktipkeun mode rojongan ketikan otomatis kahontal ngagunakeun dua métode - enable_automatic_type_cast () sarta disable_automatic_type_cast (). Ieu bisa jadi merenah lamun variabel lingkungan ngandung hiji obyék JSON-kawas serialized atawa malah ngan hiji konstanta Boolean (eksplisit netepkeun variabel DEBUG di Django ku ngabandingkeun variabel lingkungan jeung "valid" string mangrupa salah sahiji kasus nu paling umum). Tapi ayeuna henteu kedah sacara eksplisit ngarobih senar - kalolobaan tindakan anu diperyogikeun parantos dipasang di jero perpustakaan sareng ngan ngantosan sinyal pikeun meta. 🙂 Sacara umum, ngetik tiasa transparan sareng ngadukung ampir sadaya jinis data anu aya (frozenset, kompleks sareng bait henteu diuji).

Sarat pikeun ngadukung Python 2 dilaksanakeun kalayan ampir henteu aya pangorbanan (nyingkirkeun ngetik sareng sababaraha "permen gula" tina versi panganyarna tina Python 3), khususna, hatur nuhun kana genep anu aya di mana-mana (pikeun ngabéréskeun masalah ngagunakeun metaclasses. ).

Tapi aya sababaraha larangan:

  • rojongan Python 3 hartina versi 3.5 sarta saluhureuna (aya maranéhna dina proyék anjeun hasil boh hoream atawa kurangna kabutuhan perbaikan, saprak hese datang nepi ka alesan obyektif naha anjeun masih on 3.4);
  • Dina Python 2.7, perpustakaan henteu ngadukung deserialization tina set literal. Katerangan di dieu. Tapi upami aya anu hoyong ngalaksanakeunna, wilujeng sumping :);

Perpustakaan ogé ngagaduhan mékanisme iwal upami aya kasalahan parsing. Lamun string teu bisa dipikawanoh ku salah sahiji analis sadia, nilai tetep string a (rada, alesan genah tur kasaluyuan mundur jeung logika biasa kumaha variabel dianggo dina Bash).

perpustakaan python-cangkang

Ayeuna kuring bakal nyarioskeun ka anjeun ngeunaan perpustakaan kadua (kuring ngaleungitkeun katerangan ngeunaan kakurangan tina analog anu aya - sami sareng anu dijelaskeun pikeun smart-env. Analogs - di dieu и di dieu).

Sacara umum, ideu palaksanaan sareng sarat pikeun éta sami sareng anu dijelaskeun pikeun smart-env, sapertos tiasa ditingali tina 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

Gagasan ieu:

  1. Hiji kelas tunggal nu ngagambarkeun Bash di dunya Python;
  2. Unggal paréntah Bash disebut salaku fungsi tina kelas Shell;
  3. Parameter pikeun unggal pungsi nelepon lajeng dialirkeun kana saluyu Bash paréntah panggero;
  4. Unggal paréntah dieksekusi "di dieu jeung ayeuna" dina momen eta disebut, i.e. pendekatan sinkron jalan;
  5. kasebut nyaéta dimungkinkeun pikeun ngakses kaluaran paréntah di stdout, kitu ogé kode balik na;
  6. Upami paréntahna henteu aya dina sistem, iwal dibuang.

Salaku kalawan pinter-env, aya rojongan pikeun Python 2 (sanajan saeutik leuwih getih kurban diperlukeun) tur euweuh rojongan pikeun Python 3.0-3.4.

Rencana pangwangunan perpustakaan

Anjeun tiasa nganggo perpustakaan ayeuna: duanana dipasang dina PyPI resmi. Sumberna sayogi dina Github (tingali di handap).

Kadua perpustakaan bakal dikembangkeun kalayan nimbangkeun eupan balik anu dikumpulkeun ti anu kabetot. Sareng, upami sesah ngadamel rupa-rupa fitur énggal dina smart-env, teras dina cangkang python pasti aya anu sanésna pikeun nambihan:

  • rojongan pikeun telepon non-blocking;
  • kamungkinan komunikasi interaktif sareng tim (migawé bareng kalayan stdin);
  • nambahkeun sipat anyar (Contona, sipat pikeun nampa kaluaran ti stderr);
  • palaksanaan diréktori paréntah sadia (pikeun pamakéan ku dir () fungsi);
  • jeung sajabana

rujukan

  1. perpustakaan pinter-env: Github и PyPI
  2. perpustakaan cangkang python: Github и PyPI
  3. Saluran Telegram apdet perpustakaan

UPD 23.02.2020/XNUMX/XNUMX:
* Repositories geus dipindahkeun, Tumbu pakait geus diropéa
* Vérsi python-shell == 1.0.1 keur disiapkeun keur release on 29.02.2020/XNUMX/XNUMX. Parobihan kalebet dukungan pikeun paréntah autocomplete sareng paréntah dir(Shell), ngajalankeun paréntah kalayan identifier Python anu teu valid, sareng perbaikan bug.

sumber: www.habr.com

Tambahkeun komentar