Pustaka standar Python memiliki modul untuk penguraian file konfigurasi ( configparser ), pembacaan variabel lingkungan ( os.environ ), dan penguraian argumen baris perintah ( argparse ). Saya ingin menulis program yang melakukan semua itu, dan juga:
Memiliki rangkaian nilai opsi :
- nilai opsi default, diganti dengan
- opsi file konfigurasi, diganti dengan
- variabel lingkungan, diganti dengan
- opsi baris perintah.
Mengizinkan satu atau lebih lokasi file konfigurasi yang ditentukan pada baris perintah dengan misalnya
--config-file foo.conf
, dan membacanya (baik sebagai pengganti, atau tambahan, file konfigurasi biasa). Ini masih harus mematuhi kaskade di atas.Memungkinkan definisi opsi di satu tempat untuk menentukan perilaku parsing untuk file konfigurasi dan baris perintah.
Menyatukan opsi yang diurai menjadi satu kumpulan nilai opsi untuk akses program lainnya tanpa peduli dari mana asalnya.
Semua yang saya butuhkan tampaknya ada di pustaka standar Python, tetapi mereka tidak bekerja sama dengan lancar.
Bagaimana saya bisa mencapai ini dengan deviasi minimum dari pustaka standar Python?
jterrace
memberikan hadiah di sini untuk mendorong saya cukup keras untuk mencoba melakukan sesuatu seperti ini :)Jawaban:
Modul argparse membuatnya tidak murahan, selama Anda senang dengan file konfigurasi yang terlihat seperti baris perintah. (Saya pikir ini adalah keuntungan, karena pengguna hanya perlu mempelajari satu sintaks.) Pengaturan fromfile_prefix_chars ke, misalnya
@
, membuatnya jadi,setara dengan
jika
@baz.conf
ada,Anda bahkan dapat melihat kode Anda
foo.conf
secara otomatis dengan memodifikasiargv
Format file konfigurasi ini dapat dimodifikasi dengan membuat subclass dari ArgumentParser dan menambahkan metode convert_arg_line_to_args .
sumber
UPDATE: Saya akhirnya sempat meletakkan ini di pypi. Instal versi terbaru melalui:
Bantuan dan instruksi lengkap ada di sini .
Posting asli
Ini sedikit sesuatu yang saya retas bersama. Jangan ragu untuk menyarankan perbaikan / laporan bug di komentar:
MELAKUKAN
Implementasi ini masih belum selesai. Berikut sebagian daftar TODO:
argparse
menangani pesan kesalahanSesuai dengan perilaku yang didokumentasikan
dest
dariargs
dalamadd_argument
, alih-alih mengandalkanAction
objekparse_args
fungsi yang digunakanparse_known_args
. (misalnya menyalinparse_args
daricpython
implementasi untuk menjamin panggilannyaparse_known_args
.)Hal yang Kurang Mudah…
Saya belum mencoba semua ini. Ini tidak mungkin — tapi masih mungkin! —Bahwa itu bisa berhasil…
section
di file konfigurasi.)section
di file konfigurasi.)sumber
pip install configargparser
Ada perpustakaan yang melakukan hal ini yang disebut configglue .
Ini juga mendukung variabel lingkungan.
Ada juga perpustakaan lain yang disebut ConfigArgParse yaitu
Anda mungkin tertarik dengan PyCon berbicara tentang konfigurasi oleh Łukasz Langa - Biarkan Mereka Mengkonfigurasi!
sumber
Meskipun saya belum mencobanya sendiri, ada pustaka ConfigArgParse yang menyatakan bahwa ia melakukan sebagian besar hal yang Anda inginkan:
sumber
Tampaknya pustaka standar tidak menangani hal ini, membiarkan setiap pemrogram menjadi berbelit
configparser
- belit danargparse
danos.environ
semuanya bersama-sama dengan cara yang kikuk.sumber
Perpustakaan standar Python tidak menyediakan ini, sejauh yang saya tahu. Saya menyelesaikan ini sendiri dengan menulis kode untuk digunakan
optparse
danConfigParser
untuk mengurai baris perintah dan file konfigurasi, dan memberikan lapisan abstraksi di atasnya. Namun, Anda akan membutuhkan ini sebagai ketergantungan terpisah, yang dari komentar Anda sebelumnya tampaknya tidak menyenangkan.Kalau mau lihat kode yang saya tulis di http://liw.fi/cliapp/ . Ini terintegrasi ke dalam pustaka "kerangka aplikasi baris perintah" saya, karena itulah bagian besar dari apa yang perlu dilakukan kerangka kerja.
sumber
Saya mencoba sesuatu seperti ini baru-baru ini, menggunakan "optparse".
Saya mengaturnya sebagai sub-kelas OptonParser, dengan perintah '--Store' dan '--Check'.
Kode di bawah ini seharusnya sudah cukup banyak untuk Anda. Anda hanya perlu menentukan metode 'muat' dan 'simpan' Anda sendiri yang menerima / mengembalikan kamus dan Anda sudah siap.
sumber
Untuk memenuhi semua persyaratan tersebut, saya akan merekomendasikan untuk menulis perpustakaan Anda sendiri yang menggunakan [opt | arg] parse dan configparser untuk fungsionalitas yang mendasarinya.
Diberikan dua persyaratan pertama dan terakhir, saya katakan Anda menginginkan:
Langkah satu: Lakukan parser baris perintah yang hanya mencari opsi --config-file.
Langkah kedua: Parse file konfigurasi.
Langkah ketiga: siapkan pass parser baris perintah kedua menggunakan output pass file konfigurasi sebagai default.
Persyaratan ketiga kemungkinan berarti Anda harus merancang sistem definisi opsi Anda sendiri untuk mengekspos semua fungsionalitas optparse dan configparser yang Anda minati, dan menulis beberapa saluran air untuk melakukan konversi di antaranya.
sumber
Berikut adalah modul yang saya retas bersama yang membaca argumen baris perintah, pengaturan lingkungan, file ini, dan nilai keyring juga. Ini juga tersedia dalam intinya .
sumber
Anda dapat menggunakan ChainMap untuk ini. Lihat contoh saya yang saya berikan di "Manakah cara terbaik untuk mengizinkan opsi konfigurasi diganti pada baris perintah dengan Python?" SO pertanyaan.
sumber
Konfigurasi perpustakaan yang saya bangun tepat untuk memenuhi sebagian besar kebutuhan Anda.
Itu dapat melampirkan opsi baris perintah ke beberapa klik perintah
(maaf, ini bukan argparse, tapi klik lebih baik dan lebih canggih.
confect
mungkin mendukung argparse di rilis mendatang).confect
muat file konfigurasi Python, bukan JSON / YMAL / TOML / INI. Sama seperti file profil IPython atau file pengaturan DJANGO, file konfigurasi Python fleksibel dan lebih mudah untuk dipelihara.Untuk informasi lebih lanjut, silakan periksa README.rst di repositori proyek . Ketahuilah bahwa ini hanya mendukung Python3.6 up.
Contoh
Melampirkan opsi baris perintah
Ini secara otomatis membuat pesan bantuan yang komprehensif dengan semua properti dan nilai default yang dideklarasikan.
Memuat variabel lingkungan
Ini hanya membutuhkan satu baris untuk memuat variabel lingkungan
sumber