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

selamat hari semua.

Hari ini, Python adalah salah satu bahasa yang paling banyak digunakan dalam bidang mencipta bukan sahaja produk perisian itu sendiri, tetapi juga menyediakan infrastruktur mereka. Akibatnya, ramai devops, dengan kehendak mereka sendiri atau menentangnya, terpaksa mempelajari bahasa baharu untuk digunakan nanti sebagai tambahan kepada skrip Bash lama yang bagus. Walau bagaimanapun, Bash dan Python mengamalkan pendekatan yang berbeza untuk menulis kod dan mempunyai ciri-ciri tertentu, bermakna mengalihkan skrip Bash ke "bahasa ular" kadangkala ternyata menjadi tugas yang luas dan jauh daripada tugas remeh.

Untuk menjadikan hidup lebih mudah untuk devops, banyak perpustakaan dan utiliti berguna dalam Python telah dicipta dan terus dicipta. Artikel ini menerangkan dua perpustakaan baharu yang dibuat oleh pengarang siaran ini - smart-env ΠΈ tempurung ular sawa - dan direka bentuk untuk melegakan devops daripada keperluan untuk memberi banyak perhatian kepada selok-belok bekerja dengan Python, memberi ruang untuk tugas yang lebih menarik. Skop aktiviti perpustakaan ialah pembolehubah persekitaran dan melancarkan utiliti luaran.

Sesiapa berminat sila jumpa kucing.

"basikal" baru?

Nampaknya, mengapa mencipta pakej baharu untuk operasi yang agak biasa? Apakah yang menghalang anda daripada menggunakan os.environ dan subprocess.<kaedah atau kelas pilihan anda> secara langsung?

Saya akan memberikan bukti yang memihak kepada setiap perpustakaan secara berasingan.

perpustakaan smart-env

Sebelum menulis idea anda sendiri, adalah berguna untuk pergi ke dalam talian dan mencari penyelesaian siap sedia. Sudah tentu, terdapat risiko tidak menemui apa yang anda perlukan, tetapi ini adalah "acara insurans". Sebagai peraturan, pendekatan ini berfungsi dan menjimatkan banyak masa dan usaha.

Mengikut keputusan carian berikut telah didedahkan:

  • terdapat pakej yang sebenarnya membungkus panggilan ke os.environ, tetapi pada masa yang sama memerlukan sekumpulan tindakan yang mengganggu (mewujudkan contoh kelas, parameter khas dalam panggilan, dll.);
  • Terdapat pakej yang baik, yang, bagaimanapun, terikat dengan ekosistem tertentu (terutamanya rangka kerja web seperti Django) dan oleh itu tidak sama sekali universal tanpa fail;
  • terdapat percubaan yang jarang untuk melakukan sesuatu yang baru. Sebagai contoh, tambah menaip dan menghuraikan nilai pembolehubah secara eksplisit dengan memanggil kaedah seperti
    get_<typename>(var_name)

    Atau di sini satu lagi penyelesaian, yang, bagaimanapun, tidak menyokong Python 2 yang kini memalukan (yang, walaupun RIP rasmi, masih terdapat segunung kod bertulis dan keseluruhan ekosistem);

  • Terdapat kraf pelajar sekolah yang, atas sebab yang tidak diketahui, berakhir di PyPI huluan dan hanya menimbulkan masalah dengan penamaan pakej baharu (khususnya, nama "smart-env" adalah langkah yang perlu).

Dan senarai ini boleh diteruskan untuk masa yang lama. Walau bagaimanapun, perkara di atas sudah cukup untuk membuatkan saya teruja dengan idea untuk membuat sesuatu yang mudah dan universal.

Keperluan yang ditetapkan sebelum menulis smart-env:

  • Skim penggunaan paling mudah
  • Sokongan menaip data yang mudah dikonfigurasikan
  • Python 2.7 serasi
  • Liputan kod yang baik melalui ujian

Akhirnya, semua ini direalisasikan. Berikut 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 boleh lihat daripada contoh, untuk bekerja dengan kelas baharu, anda hanya perlu mengimportnya (anda tidak perlu membuat contoh - tolak tindakan tambahan). Akses kepada mana-mana pembolehubah persekitaran dicapai dengan merujuknya sebagai pembolehubah kelas ENV, yang, sebenarnya, menjadikan kelas ini pembungkus intuitif untuk persekitaran sistem asli, sambil pada masa yang sama mengubahnya menjadi objek konfigurasi yang mungkin untuk hampir mana-mana sistem ( pendekatan yang serupa, sebagai contoh, dicapai dalam Django , hanya di sana objek konfigurasi ialah modul/pakej tetapan itu sendiri).

Mendayakan/melumpuhkan mod sokongan penaip automatik dicapai menggunakan dua kaedah - enable_automatic_type_cast() dan disable_automatic_type_cast(). Ini boleh menjadi mudah jika pembolehubah persekitaran mengandungi objek seperti JSON bersiri atau hanya pemalar Boolean (menetapkan pembolehubah DEBUG secara eksplisit dalam Django dengan membandingkan pembolehubah persekitaran dengan rentetan "sah" adalah salah satu kes yang paling biasa). Tetapi kini tidak perlu menukar rentetan secara eksplisit - kebanyakan tindakan yang diperlukan sudah tertanam di kedalaman perpustakaan dan hanya menunggu isyarat untuk bertindak. πŸ™‚ Secara umum, menaip berfungsi dengan telus dan menyokong hampir semua jenis data terbina dalam yang tersedia (set beku, kompleks dan bait tidak diuji).

Keperluan untuk menyokong Python 2 telah dilaksanakan dengan hampir tanpa pengorbanan (peninggalan menaip dan beberapa "gula-gula gula" versi terkini Python 3), khususnya, terima kasih kepada enam yang ada di mana-mana (untuk menyelesaikan masalah menggunakan metaclasses ).

Tetapi terdapat beberapa sekatan:

  • Sokongan Python 3 bermakna versi 3.5 dan lebih tinggi (kehadiran mereka dalam projek anda adalah hasil daripada kemalasan atau kekurangan keperluan untuk penambahbaikan, kerana sukar untuk menghasilkan sebab objektif mengapa anda masih menggunakan 3.4);
  • Dalam Python 2.7, perpustakaan tidak menyokong penyahserialisasian set literal. Penerangan di sini. Tetapi jika ada yang ingin melaksanakannya, dipersilakan :);

Perpustakaan juga mempunyai mekanisme pengecualian sekiranya berlaku ralat penghuraian. Jika rentetan itu tidak dapat dikenali oleh mana-mana penganalisis yang tersedia, nilai itu kekal sebagai rentetan (sebaliknya, atas sebab kemudahan dan keserasian ke belakang dengan logik biasa tentang cara pembolehubah berfungsi dalam Bash).

perpustakaan python-shell

Sekarang saya akan memberitahu anda tentang perpustakaan kedua (saya akan meninggalkan penerangan tentang kekurangan analog sedia ada - ia serupa dengan yang diterangkan untuk smart-env. Analogs - di sini ΠΈ di sini).

Secara umum, idea pelaksanaan dan keperluan untuknya adalah serupa dengan yang diterangkan 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

Ideanya ialah ini:

  1. Kelas tunggal yang mewakili Bash dalam dunia Python;
  2. Setiap arahan Bash dipanggil sebagai fungsi kelas Shell;
  3. Parameter untuk setiap panggilan fungsi kemudiannya dihantar ke dalam panggilan arahan Bash yang sepadan;
  4. Setiap arahan dilaksanakan "di sini dan sekarang" pada masa ia dipanggil, i.e. pendekatan segerak berfungsi;
  5. adalah mungkin untuk mengakses output arahan dalam stdout, serta kod pemulangannya;
  6. Jika arahan tiada dalam sistem, pengecualian akan dilemparkan.

Seperti smart-env, terdapat sokongan untuk Python 2 (walaupun sedikit lagi darah korban diperlukan) dan tiada sokongan untuk Python 3.0-3.4.

Rancangan pembangunan perpustakaan

Anda boleh menggunakan perpustakaan sekarang: kedua-duanya disiarkan pada PyPI rasmi. Sumber boleh didapati di Github (lihat di bawah).

Kedua-dua perpustakaan akan dibangunkan dengan mengambil kira maklum balas yang dikumpul daripada mereka yang berminat. Dan, jika sukar untuk menghasilkan pelbagai ciri baharu dalam smart-env, maka dalam python-shell pasti ada sesuatu yang lain untuk ditambah:

  • sokongan untuk panggilan tidak menyekat;
  • kemungkinan komunikasi interaktif dengan pasukan (bekerja dengan stdin);
  • menambah sifat baru (sebagai contoh, harta untuk menerima output daripada stderr);
  • pelaksanaan direktori arahan yang tersedia (untuk digunakan dengan fungsi dir());
  • dan lain-lain

rujukan

  1. perpustakaan smart-env: Github ΠΈ PyPI
  2. perpustakaan python-shell: Github ΠΈ PyPI
  3. Saluran Telegram kemas kini perpustakaan

UPD 23.02.2020/XNUMX/XNUMX:
* Repositori telah dialihkan, pautan yang sepadan telah dikemas kini
* Versi python-shell==1.0.1 sedang disediakan untuk dikeluarkan pada 29.02.2020/XNUMX/XNUMX. Perubahan termasuk sokongan untuk autolengkap perintah dan perintah dir(Shell), menjalankan arahan dengan pengecam Python yang tidak sah dan pembetulan pepijat.

Sumber: www.habr.com

Tambah komen