Kami berteman dengan Python dan Bash: pustaka smart-env dan python-shell

Hari baik untuk semua

Saat ini, Python adalah salah satu bahasa yang paling banyak digunakan di bidang penciptaan tidak hanya produk perangkat lunak secara langsung, tetapi juga menyediakan infrastruktur mereka. Akibatnya, banyak devop, dengan kehendak atau menentangnya, harus belajar bahasa baru untuk digunakan nanti sebagai pelengkap skrip Bash lama yang bagus. Namun, Bash dan Python menyatakan pendekatan yang berbeda untuk menulis kode dan memiliki fitur tertentu, mengingat porting skrip Bash ke "bahasa ular" kadang-kadang luas dan jauh dari tugas sepele.

Untuk membuat hidup lebih mudah bagi para devs, banyak perpustakaan dan utilitas yang berguna dengan Python telah dibuat dan terus dibuat. Artikel ini segera menjelaskan dua perpustakaan baru yang dibuat oleh penulis posting ini - smart-envdan python-shell - dan dirancang untuk menyelamatkan para devops dari kebutuhan untuk memperhatikan banyak seluk-beluk bekerja dengan Python, meninggalkan ruang untuk tugas-tugas yang lebih menarik. Ruang lingkup perpustakaan adalah variabel lingkungan dan peluncuran utilitas eksternal.

Yang tertarik, silakan, di bawah kucing.

Sepeda baru?


Tampaknya, mengapa membuat paket baru untuk operasi yang cukup biasa? Apa yang mencegah penggunaan langsung os.environment dan subproses. <Metode atau kelas pilihan Anda>?

Saya akan memberikan bukti yang mendukung masing-masing perpustakaan secara terpisah.

Pustaka cerdas-env


Sebelum menulis gagasan Anda sendiri, ada baiknya berselancar di Internet dan mencari solusi yang sudah jadi. Tentu saja, ada risiko tidak menemukan apa yang Anda butuhkan, tetapi lebih merupakan "kasus asuransi". Sebagai aturan, pendekatan ini bekerja dan menghemat banyak waktu dan upaya.

Menurut hasil pencarian , berikut ini diungkapkan:

  • ada paket yang benar-benar membungkus panggilan ke os.environment, tetapi pada saat yang sama memerlukan banyak tindakan yang mengganggu (membuat turunan kelas, parameter khusus dalam panggilan, dll.);
  • ada paket bagus yang terikat erat dengan ekosistem tertentu (terutama kerangka kerja web seperti Django) dan karenanya tidak universal tanpa file;
  • ada upaya langka untuk melakukan sesuatu yang baru. Misalnya, tambahkan pengetikan dan parsing secara eksplisit nilai variabel dengan memanggil metode formulir

    get_<typename>(var_name)

    Atau di sini ada solusi lain yang, bagaimanapun, saat ini tidak mendukung Python 2 yang dipermalukan (di mana, meskipun RIP resmi , masih ada pegunungan kode tertulis dan seluruh ekosistem);
  • ada kerajinan sekolah-siswa, sama sekali tidak jelas mengapa mereka berakhir di PyPI hulu dan hanya menciptakan masalah dengan penamaan paket baru (khususnya, nama "smart-env" adalah ukuran yang diperlukan).

Dan daftarnya terus bertambah. Namun, poin-poin di atas sudah cukup untuk menangkap ide membuat sesuatu yang nyaman dan universal.

Persyaratan untuk smart-env:

  • Skema penggunaan yang paling sederhana
  • Dukungan Pengetikan Data yang Mudah Dikonfigurasi
  • Python 2.7 kompatibel
  • Cakupan tes bagus

Pada akhirnya, semua ini terwujud. Ini adalah contoh penggunaan:

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

Seperti yang Anda lihat dari contoh, untuk bekerja dengan kelas baru cukup untuk mengimpornya (Anda tidak perlu membuat instance - dikurangi tindakan ekstra). Akses ke variabel lingkungan apa pun dicapai dengan merujuknya sebagai variabel kelas ENV, yang, pada kenyataannya, menjadikan kelas ini pembungkus intuitif untuk lingkungan sistem asli, sekaligus mengubahnya menjadi varian yang mungkin dari objek konfigurasi hampir semua sistem (pendekatan yang serupa, misalnya, dicapai di Django , hanya ada objek konfigurasi secara langsung paket modul / pengaturan).

Mengaktifkan / menonaktifkan mode dukungan pengetikan otomatis dicapai dengan menggunakan dua metode - enable_automatic_type_cast () dan disable_automatic_type_cast (). Ini bisa nyaman jika variabel lingkungan berisi objek serial seperti JSON atau bahkan hanya konstanta Boolean (secara eksplisit mengatur variabel DEBUG di Django dengan membandingkan variabel lingkungan dengan string "valid" adalah salah satu kasus yang paling umum). Tetapi sekarang tidak perlu untuk secara eksplisit mengkonversi baris - sebagian besar tindakan yang diperlukan sudah tertanam di dalam perut perpustakaan dan hanya menunggu sinyal untuk bertindak. :) Secara umum, pengetikan bekerja secara transparan dan mendukung hampir semua tipe data bawaan yang tersedia (frozenset, complex, dan bytes belum diuji).

Persyaratan dukungan untuk Python 2 diimplementasikan dengan hampir tanpa pengorbanan (meninggalkan pengetikan dan beberapa gula di Python 3 versi terbaru), khususnya, berkat enam yang ada di mana-mana (untuk menyelesaikan masalah menggunakan metaclasses).

Tetapi ada beberapa batasan:

  • Dukungan untuk Python 3 menyiratkan versi 3.5 dan lebih tinggi (kehadiran mereka di proyek Anda adalah hasil dari kemalasan atau kurangnya kebutuhan untuk perbaikan, karena sulit untuk datang dengan alasan obyektif mengapa Anda masih duduk di 3.4);
  • Dalam Python 2.7, perpustakaan tidak mendukung deserialization dari himpunan literal. Deskripsi di sini . Tapi, jika seseorang ingin menerapkan - selamat datang :);

Perpustakaan juga menyatakan mekanisme pengecualian jika terjadi kesalahan parsing. Jika string tidak dapat dikenali oleh salah satu analisa yang tersedia, nilainya tetap string (lebih tepatnya, untuk alasan kenyamanan dan kompatibilitas dengan logika variabel biasa dalam Bash).

Pustaka python-shell


Sekarang saya akan berbicara tentang perpustakaan kedua (saya akan menghilangkan deskripsi tentang kekurangan dari analog yang tersedia - mirip dengan yang dijelaskan untuk smart-env. Analog di sini dan di sini ).

Secara umum, gagasan implementasi dan persyaratan untuknya serupa dengan yang dijelaskan untuk smart-env, seperti yang dapat dilihat dari contoh:

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

Idenya adalah ini:

  1. Kelas tunggal yang mewakili Bash di dunia Python;
  2. Setiap perintah Bash disebut sebagai fungsi dari kelas Shell;
  3. Parameter panggilan masing-masing fungsi kemudian diteruskan ke panggilan ke perintah Bash yang sesuai;
  4. Setiap perintah dieksekusi "di sini dan sekarang" pada saat pemanggilannya, yaitu bekerja dengan pendekatan sinkron;
  5. adalah mungkin untuk mengakses perintah knalpot di stdout, serta kode kembalinya;
  6. Jika perintah tidak ada dalam sistem, pengecualian dilemparkan.

Seperti smart-env, dukungan untuk Python 2 disediakan (meskipun butuh sedikit lebih banyak darah pengorbanan) dan tidak ada dukungan untuk Python 3.0-3.4.

Rencana Pengembangan Perpustakaan


Anda dapat menggunakan perpustakaan sekarang: keduanya diletakkan di PyPI resmi. Sumber tersedia di Github (lihat di bawah).

Kedua perpustakaan akan dikembangkan dengan mempertimbangkan umpan balik akun yang dikumpulkan dari mereka yang tertarik. Dan, jika di smart-env mungkin sulit untuk membuat berbagai fitur baru, maka pasti ada sesuatu yang lain untuk ditambahkan di python-shell:

  • dukungan untuk panggilan yang tidak menghalangi;
  • kemungkinan komunikasi interaktif dengan tim (bekerja dengan stdin);
  • menambahkan properti baru (misalnya, properti untuk mendapatkan knalpot dari stderr);
  • implementasi katalog perintah yang tersedia (untuk digunakan dengan fungsi dir ());
  • dll.

Referensi


  1. Pustaka Smart-env: Github dan PyPI
  2. Pustaka Python-shell: github dan pypi
  3. Saluran telegram untuk pembaruan perpustakaan


UPD 02/23/2020:
* Repositori telah dipindahkan, tautan yang sesuai telah diperbarui
* Versi python-shell == 1.0.1 sedang dipersiapkan untuk dirilis pada 02/29/2020. Di antara perubahan adalah dukungan untuk autocomplete dari perintah dan perintah dir (Shell), peluncuran perintah dengan pengidentifikasi tidak sah Python, dan perbaikan bug.

UPD 03/01/2020:
* Posting pada rilis selanjutnya.

All Articles