Apa metode atau pustaka termudah , tersest , dan paling fleksibel untuk parsing argumen baris perintah Python?
Apa metode atau pustaka termudah , tersest , dan paling fleksibel untuk parsing argumen baris perintah Python?
Jawaban ini menyarankan optparse
yang sesuai untuk versi Python yang lebih lama. Untuk Python 2.7 dan di atasnya, argparse
gantikan optparse
. Lihat jawaban ini untuk informasi lebih lanjut.
Seperti yang ditunjukkan orang lain, Anda lebih baik menggunakan optparse daripada getopt. getopt cukup banyak pemetaan satu-ke-satu dari fungsi perpustakaan getopt (3) C standar, dan tidak sangat mudah digunakan.
optparse, sementara sedikit lebih bertele-tele, jauh lebih terstruktur dan lebih mudah untuk diperluas nanti.
Inilah garis khas untuk menambahkan opsi ke parser Anda:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
Cukup banyak berbicara sendiri; pada waktu pemrosesan, ia akan menerima -q atau --query sebagai opsi, menyimpan argumen dalam atribut yang disebut kueri dan memiliki nilai default jika Anda tidak menentukannya. Ini juga mendokumentasikan diri sendiri ketika Anda mendeklarasikan argumen bantuan (yang akan digunakan saat dijalankan dengan -h / - help) di sana dengan opsi.
Biasanya Anda mengurai argumen Anda dengan:
options, args = parser.parse_args()
Ini akan, secara default, mem-parsing argumen standar yang diteruskan ke skrip (sys.argv [1:])
options.query kemudian akan diatur ke nilai yang Anda berikan ke skrip.
Anda membuat parser hanya dengan melakukan
parser = optparse.OptionParser()
Ini semua dasar-dasar yang Anda butuhkan. Berikut skrip Python lengkap yang menunjukkan ini:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5 baris python yang menunjukkan dasar-dasar.
Simpan di sample.py, dan jalankan sekali dengan
python sample.py
dan sekali dengan
python sample.py --query myquery
Di luar itu, Anda akan menemukan bahwa optparse sangat mudah diperluas. Di salah satu proyek saya, saya membuat kelas Command yang memungkinkan Anda untuk membuat sarang perintah di pohon perintah dengan mudah. Ini menggunakan optparse berat untuk rantai perintah bersama. Ini bukan sesuatu yang bisa saya jelaskan dengan mudah dalam beberapa baris, tetapi merasa bebas untuk menelusuri di repositori saya untuk kelas utama, serta kelas yang menggunakannya dan parser opsi
-mcProfile -o program.prof
tetapi agrparcer menangkap args ini, bagaimana cara meneruskan args ini ke python exe ???argparse
adalah cara untuk pergi. Berikut ini ringkasan singkat cara menggunakannya:1) Inisialisasi
2) Tambahkan Argumen
3) Parse
4) Akses
5) Periksa Nilai
Pemakaian
Penggunaan yang benar:
Argumen yang salah:
Bantuan penuh:
sumber
Menggunakan docopt
Sejak 2012 ada modul yang sangat mudah, kuat dan sangat keren untuk parsing argumen yang disebut docopt . Berikut ini contoh yang diambil dari dokumentasinya:
Jadi ini dia: 2 baris kode ditambah tali doc Anda yang adalah penting dan Anda mendapatkan argumen Anda diurai dan tersedia di objek argumen Anda.
Menggunakan python-fire
Sejak 2017 ada modul keren lain bernama python-fire . Itu dapat menghasilkan antarmuka CLI untuk kode Anda dengan Anda melakukan parsing argumen nol . Berikut adalah contoh sederhana dari dokumentasi (program kecil ini memperlihatkan fungsi
double
ke baris perintah):Dari baris perintah, Anda dapat menjalankan:
sumber
Cara pinggul baru adalah
argparse
untuk alasan ini . argparse> optparse> getoptpembaruan: Pada py2.7 argparse adalah bagian dari perpustakaan standar dan optparse sudah tidak digunakan lagi.
sumber
Saya lebih suka Klik . Ini mengabstraksi opsi pengelolaan dan memungkinkan "(...) membuat antarmuka baris perintah yang indah dengan cara yang mudah dikompilasi dengan kode sesedikit yang diperlukan".
Berikut contoh penggunaannya:
Itu juga secara otomatis menghasilkan halaman bantuan yang diformat dengan baik:
sumber
Cukup banyak orang menggunakan getopt
Berikut ini contoh kode untuk dokumen:
Jadi singkatnya, ini dia cara kerjanya.
Anda punya dua jenis opsi. Mereka yang menerima argumen, dan mereka yang seperti switch.
sys.argv
Anda cukup banyakchar** argv
di C. Seperti di C Anda melewatkan elemen pertama yang merupakan nama program Anda dan hanya menguraikan argumen:sys.argv[1:]
Getopt.getopt
akan menguraikannya sesuai dengan aturan yang Anda berikan dalam argumen."ho:v"
di sini menggambarkan argumen singkat:-ONELETTER
. Cara:
yang-o
menerima satu argumen.Akhirnya
["help", "output="]
menjelaskan argumen panjang (--MORETHANONELETTER
). The=
setelah keluaran sekali lagi berarti output yang menerima satu argumen.Hasilnya adalah daftar pasangan (opsi, argumen)
Jika suatu opsi tidak menerima argumen apa pun (seperti di
--help
sini)arg
bagian tersebut adalah string kosong. Anda kemudian biasanya ingin mengulang daftar ini dan menguji nama opsi seperti pada contoh.Saya harap ini membantu Anda.
sumber
getopt
versi Python yang lebih baru, jawaban ini sudah kedaluwarsa.getopt
masih belum usang ... Tetapi dokumentasinya menyatakan bahwa ini terutama disediakan untuk pengguna yang akrab dengangetopt()
fungsi C , dan mengakui bahwa bagi pengguna lainargparse
mungkin merupakan solusi yang lebih baik, memungkinkan untuk "menulis lebih sedikit kode dan mendapatkan bantuan yang lebih baik dan pesan kesalahan ".Gunakan
optparse
yang datang dengan perpustakaan standar. Sebagai contoh:Sumber: Menggunakan Python untuk membuat alat baris perintah UNIX
Namun pada Python 2.7 optparse sudah usang, lihat: Mengapa menggunakan argparse daripada optparse?
sumber
Jika Anda perlu, ini dapat membantu jika Anda perlu mengambil argumen unicode di Win32 (2K, XP dll):
sumber
Argumen baris perintah ringan
Meskipun
argparse
hebat dan merupakan jawaban yang tepat untuk sakelar baris perintah yang sepenuhnya didokumentasikan dan fitur-fitur canggih, Anda dapat menggunakan default argumen fungsi untuk menangani argumen posisi langsung dengan sangat sederhana.Argumen 'nama' menangkap nama skrip dan tidak digunakan. Hasil tes terlihat seperti ini:
Untuk skrip sederhana di mana saya hanya ingin beberapa nilai default, saya menemukan ini cukup memadai. Anda mungkin juga ingin memasukkan beberapa jenis paksaan dalam nilai-nilai kembali atau nilai-nilai baris perintah semua akan menjadi string.
sumber
Saya lebih suka optparse daripada getopt. Ini sangat deklaratif: Anda memberi tahu itu nama opsi dan efek yang seharusnya mereka miliki (misalnya, menyetel bidang boolean), dan memberi Anda kamus yang diisi sesuai dengan spesifikasi Anda.
http://docs.python.org/lib/module-optparse.html
sumber
Saya pikir cara terbaik untuk proyek yang lebih besar adalah optparse, tetapi jika Anda mencari cara yang mudah, mungkin http://werkzeug.pocoo.org/documentation/script adalah sesuatu untuk Anda.
Jadi pada dasarnya setiap fungsi action_ * terpapar ke baris perintah dan pesan bantuan yang bagus dihasilkan secara gratis.
sumber
declarative_parser
. Tentu saja, jika seseorang bekerja dengan werkzeug, mungkin lebih baik menyimpannyawerkzung.script
. Bagaimanapun, saya penggemar berat pendekatan semacam itu.Kode argparse bisa lebih lama dari kode implementasi aktual!
Itulah masalah yang saya temukan dengan opsi parsing argumen paling populer adalah bahwa jika parameter Anda hanya sederhana, kode untuk mendokumentasikannya menjadi tidak proporsional besar untuk manfaat yang mereka berikan.
Pendatang baru relatif ke adegan parsing argumen (saya pikir) adalah plac .
Itu membuat beberapa trade-off yang diakui dengan argparse, tetapi menggunakan dokumentasi sebaris dan hanya membungkus
main()
fungsi fungsi tipe:sumber
Consoleargs layak disebutkan di sini. Sangat mudah digunakan. Saksikan berikut ini:
Sekarang di konsol:
sumber
Inilah metode, bukan perpustakaan, yang sepertinya bekerja untuk saya.
Tujuan di sini harus singkat, setiap argumen diurai oleh satu baris, argumen berbaris agar mudah dibaca, kode sederhana dan tidak bergantung pada modul khusus apa pun (hanya os + sys), memperingatkan tentang argumen yang hilang atau tidak dikenal dengan anggun. , gunakan loop sederhana untuk / range (), dan bekerja melintasi python 2.x dan 3.x
Ditampilkan dua flag toggle (-d, -v), dan dua nilai dikontrol oleh argumen (-i xxx dan -o xxx).
Tujuan dari NextArg () adalah untuk mengembalikan argumen berikutnya sambil memeriksa data yang hilang, dan 'lompati' melompati loop ketika NextArg () digunakan, menjaga flag yang diuraikan menjadi satu liner.
sumber
Saya memperluas pendekatan Erco untuk memungkinkan argumen posisi yang diperlukan dan untuk argumen opsional. Ini harus mendahului argumen -d, -v dll.
Argumen posisional dan opsional dapat diambil masing-masing dengan PosArg (i) dan OptArg (i, default). Ketika argumen opsional ditemukan, posisi awal pencarian opsi (misalnya -i) digerakkan 1 di depan untuk menghindari menyebabkan fatal 'tidak terduga'.
sumber