Membuat Persahabatan Python dan Bash: perpustakaan smart-env dan python-shell

Hari baik untuk semua.

Saat ini, Python adalah salah satu bahasa yang paling banyak digunakan di bidang pembuatan tidak hanya produk perangkat lunak itu sendiri, tetapi juga penyediaan infrastrukturnya. Akibatnya, banyak pengembang, baik atas kemauan atau tidak, harus mempelajari bahasa baru untuk digunakan nanti sebagai pelengkap skrip Bash lama yang bagus. Namun, Bash dan Python memiliki pendekatan yang berbeda dalam menulis kode dan memiliki fitur tertentu, yang berarti bahwa memindahkan skrip Bash ke β€œbahasa ular” terkadang menjadi tugas yang rumit dan jauh dari tugas sepele.

Untuk membuat hidup lebih mudah bagi para devops, banyak perpustakaan dan utilitas berguna dengan Python telah dibuat dan terus dibuat. Artikel ini menjelaskan dua perpustakaan baru yang dibuat oleh penulis posting ini - lingkungan cerdas ΠΈ kulit ular piton - dan dirancang untuk menghilangkan kebutuhan para pengembang untuk memberikan banyak perhatian pada seluk-beluk bekerja dengan Python, memberikan ruang untuk tugas-tugas yang lebih menarik. Ruang lingkup kegiatan perpustakaan adalah variabel lingkungan dan peluncuran utilitas eksternal.

Siapa pun yang tertarik, silakan lihat kucing.

"Sepeda" baru?

Tampaknya, mengapa membuat paket baru untuk operasi biasa? Apa yang mencegah Anda menggunakan os.environ dan subproses.<metode atau kelas pilihan Anda> secara langsung?

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

perpustakaan smart-env

Sebelum menulis gagasan Anda sendiri, ada baiknya untuk mengakses internet dan mencari solusi yang sudah jadi. Tentu saja, ada risiko tidak menemukan apa yang Anda butuhkan, tetapi ini lebih merupakan β€œperistiwa asuransi”. Biasanya, pendekatan ini berhasil dan menghemat banyak waktu dan tenaga.

Menurut hasil cari berikut ini terungkap:

  • ada paket yang benar-benar membungkus panggilan ke os.environ, tetapi pada saat yang sama memerlukan banyak tindakan yang mengganggu (membuat instance kelas, parameter khusus dalam panggilan, dll.);
  • Ada paket bagus, namun, terikat erat pada ekosistem tertentu (terutama kerangka web seperti Django) dan oleh karena itu sama sekali tidak universal tanpa file;
  • jarang ada upaya untuk melakukan sesuatu yang baru. Misalnya, tambahkan pengetikan dan secara eksplisit mengurai nilai variabel dengan memanggil metode seperti
    get_<typename>(var_name)

    Atau di sini satu solusi lagi, yang, bagaimanapun, tidak mendukung Python 2 yang sekarang dipermalukan (meskipun demikian RIP resmi, masih terdapat segunung kode tertulis dan seluruh ekosistem);

  • Ada kerajinan siswa sekolah yang, karena alasan yang tidak diketahui, berakhir di PyPI hulu dan hanya menimbulkan masalah dengan penamaan paket baru (khususnya, nama β€œsmart-env” adalah tindakan yang perlu).

Dan daftar ini bisa berlangsung lama. Namun poin-poin di atas sudah cukup membuat saya bersemangat dengan ide membuat sesuatu yang nyaman dan universal.

Persyaratan yang ditetapkan sebelum menulis smart-env:

  • Skema penggunaan paling sederhana
  • Dukungan pengetikan data yang mudah dikonfigurasi
  • Kompatibel dengan Python 2.7
  • Cakupan kode yang bagus berdasarkan pengujian

Pada akhirnya, semua itu terwujud. Berikut ini contoh penggunaannya:

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 dapat Anda lihat dari contoh, untuk bekerja dengan kelas baru, Anda hanya perlu mengimpornya (Anda tidak perlu membuat instance - tanpa tindakan tambahan). 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 objek konfigurasi yang memungkinkan untuk hampir semua sistem ( pendekatan serupa, misalnya, dicapai di Django, hanya saja objek konfigurasinya adalah modul pengaturan/paket itu sendiri).

Mengaktifkan/menonaktifkan mode dukungan pengetikan otomatis dilakukan dengan menggunakan dua metode - aktifkan_automatic_type_cast() dan nonaktifkan_automatic_type_cast(). Hal ini dapat memudahkan jika variabel lingkungan berisi objek seperti JSON berseri atau bahkan hanya konstanta Boolean (secara eksplisit menyetel variabel DEBUG di Django dengan membandingkan variabel lingkungan dengan string "sah" adalah salah satu kasus yang paling umum). Namun sekarang tidak perlu mengonversi string secara eksplisit - sebagian besar tindakan yang diperlukan sudah tertanam di kedalaman perpustakaan dan hanya menunggu sinyal untuk bertindak. πŸ™‚ Secara umum, pengetikan berfungsi secara transparan dan mendukung hampir semua tipe data bawaan yang tersedia (frozenset, kompleks, dan byte tidak diuji).

Persyaratan untuk mendukung Python 2 diimplementasikan hampir tanpa pengorbanan (pengabaian pengetikan dan beberapa "permen gula" dari versi terbaru Python 3), khususnya, berkat enam yang ada di mana-mana (untuk memecahkan masalah penggunaan metaclasses ).

Namun ada beberapa batasan:

  • Dukungan Python 3 berarti versi 3.5 dan lebih tinggi (kehadiran mereka di proyek Anda adalah akibat dari kemalasan atau kurangnya kebutuhan untuk perbaikan, karena sulit untuk memberikan alasan obyektif mengapa Anda masih menggunakan 3.4);
  • Di Python 2.7, perpustakaan tidak mendukung deserialisasi set literal. Keterangan di sini. Namun jika ada yang ingin menerapkannya, silakan :);

Perpustakaan juga memiliki mekanisme pengecualian jika terjadi kesalahan penguraian. Jika string tidak dapat dikenali oleh salah satu penganalisis yang tersedia, nilainya tetap berupa string (sebaliknya, karena alasan kenyamanan dan kompatibilitas dengan logika umum tentang cara kerja variabel di Bash).

perpustakaan python-shell

Sekarang saya akan memberi tahu Anda tentang perpustakaan kedua (saya akan menghilangkan deskripsi kekurangan analog yang ada - mirip dengan yang dijelaskan untuk smart-env. Analog - di sini ΠΈ di sini).

Secara umum ide implementasi dan persyaratannya mirip dengan yang dijelaskan untuk smart-env, seperti 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. Satu kelas yang mewakili Bash di dunia Python;
  2. Setiap perintah Bash dipanggil sebagai fungsi dari kelas Shell;
  3. Parameter untuk setiap pemanggilan fungsi kemudian diteruskan ke pemanggilan perintah Bash yang sesuai;
  4. Setiap perintah dijalankan β€œdi sini dan sekarang” pada saat dipanggil, mis. pendekatan sinkron berhasil;
  5. dimungkinkan untuk mengakses output dari suatu perintah di stdout, serta kode pengembaliannya;
  6. Jika perintah tidak ada dalam sistem, pengecualian akan diberikan.

Seperti halnya smart-env, ada dukungan untuk Python 2 (walaupun diperlukan lebih banyak pengorbanan darah) dan tidak ada dukungan untuk Python 3.0-3.4.

Rencana pengembangan perpustakaan

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

Kedua perpustakaan akan dikembangkan dengan mempertimbangkan masukan yang dikumpulkan dari pihak-pihak yang berkepentingan. Dan, jika mungkin sulit untuk menghadirkan berbagai fitur baru di smart-env, maka di python-shell pasti ada hal lain yang perlu ditambahkan:

  • dukungan untuk panggilan non-pemblokiran;
  • kemungkinan komunikasi interaktif dengan tim (bekerja dengan stdin);
  • menambahkan properti baru (misalnya, properti untuk menerima keluaran dari stderr);
  • implementasi direktori perintah yang tersedia (untuk digunakan dengan fungsi dir());
  • dan lain-lain

referensi

  1. perpustakaan smart-env: Github ΠΈ PyPI
  2. perpustakaan python-shell: Github ΠΈ PyPI
  3. saluran telegram pembaruan perpustakaan

UPD23.02.2020:
* Repositori telah dipindahkan, tautan terkait telah diperbarui
* Versi python-shell==1.0.1 sedang dipersiapkan untuk rilis pada 29.02.2020/XNUMX/XNUMX. Perubahan mencakup dukungan untuk pelengkapan otomatis perintah dan perintah dir(Shell), menjalankan perintah dengan pengidentifikasi Python yang tidak valid, dan perbaikan bug.

Sumber: www.habr.com

Tambah komentar