Saya awalnya seorang programmer C. Saya telah melihat banyak trik dan "retasan" untuk membaca berbagai argumen.
Apa sajakah cara programmer Python dapat melakukan ini?
Terkait
- Apa cara terbaik untuk mengambil / menguraikan argumen baris perintah yang diteruskan ke skrip Python?
- Menerapkan antarmuka baris perintah gaya "[command] [action] [parameter]"?
- Bagaimana saya bisa memproses argumen baris perintah dengan Python?
- Bagaimana cara memformat argumen posisi membantu menggunakan optparse Python?
python
command-line
command-line-arguments
martineau
sumber
sumber
Jawaban:
Solusi kanonik di perpustakaan standar adalah
argparse
( dokumen ):Berikut ini sebuah contoh:
argparse
mendukung (antara lain):sumber
optparse
sudah usang, penanya pertanyaan tidak lagi menjadi anggota di stack overflow, dan ini adalah jawaban yang diterima pada pertanyaan yang sangat terlihat - harap pertimbangkan untuk sepenuhnya menulis ulang kode contoh Anda untuk menggunakan stdlibargparse
sebagai gantinya.sys.argv
adalah daftar yang berisi semua argumen yang diteruskan ke skrip pada baris perintah.Pada dasarnya,
sumber
sys.argv[1:]
(menghindari nama skrip).Hanya berkeliling evangelisasi untuk argparse yang lebih baik karena alasan ini .. pada dasarnya:
(disalin dari tautan)
modul argparse dapat menangani argumen posisi dan opsional, sementara optparse hanya dapat menangani argumen opsional
argparse tidak dogmatis tentang tampilan antarmuka baris perintah Anda - opsi seperti -file atau / file didukung, seperti opsi yang diperlukan. Optparse menolak untuk mendukung fitur-fitur ini, lebih memilih kemurnian daripada kepraktisan
argparse menghasilkan pesan penggunaan yang lebih informatif, termasuk penggunaan baris perintah yang ditentukan dari argumen Anda, dan pesan bantuan untuk argumen posisional dan opsional. Modul optparse mengharuskan Anda untuk menulis string penggunaan Anda sendiri, dan tidak memiliki cara untuk menampilkan bantuan untuk argumen posisi.
argparse mendukung tindakan yang menggunakan sejumlah variabel argumen baris perintah, sementara optparse mengharuskan jumlah argumen yang tepat (misalnya 1, 2, atau 3) diketahui terlebih dahulu
argparse mendukung parser yang mengirim ke sub-perintah, sedangkan optparse memerlukan pengaturan
allow_interspersed_args
dan melakukan pengiriman parser secara manualDan favorit pribadi saya:
add_argument()
ditentukan dengan callable sederhana, sementara optparse membutuhkan atribut kelas peretasan sepertiSTORE_ACTIONS
atauCHECK_METHODS
untuk mendapatkan pemeriksaan argumensumber
-f
atau--foo
, sementara "jumlah persis argumen yang diketahui sebelumnya" mungkin berarti argumen posisional yang diberikan tanpa bendera opsi sebelumnya.Ada juga
argparse
modul stdlib ("perbaikan" padaoptparse
modul stdlib ). Contoh dari pengantar argparse :Pemakaian:
sumber
Salah satu cara untuk melakukannya adalah menggunakan
sys.argv
. Ini akan mencetak nama skrip sebagai argumen pertama dan semua parameter lain yang Anda berikan.sumber
The docopt perpustakaan benar-benar licin. Itu membangun dict argumen dari string penggunaan untuk aplikasi Anda.
Misalnya dari docopt readme:
sumber
Jika Anda membutuhkan sesuatu yang cepat dan tidak terlalu fleksibel
main.py:
Lalu lari
python main.py James Smith
untuk menghasilkan output berikut:
sumber
python main.py "James Smith"
yang menempatkanJames Smith
disys.argv[1]
dan menghasilkanIndexError
ketika Anda mencoba untuk menggunakan tidak ada yangsys.argv[2]
. Perilaku mengutip agak tergantung pada platform dan shell mana Anda menjalankan Python.python main.py "James Joseph Smith"
? Jika Anda khawatir dengan indeks di luar batas, Anda dapat menambahkan tanda centang untuk jumlah argumen yang disediakan. Kurang realistis atau tidak, contoh saya menunjukkan bagaimana menangani beberapa argumen.gmail-trash-msg.py MessageID
. Jawaban ini langsung ke depan untuk mengujiMessageID
parameter telah diteruskansys.argv[1]
.sumber
Saya menggunakan optparse sendiri, tetapi sangat suka arah yang diambil Simon Willison dengan perpustakaan optfunc yang baru diperkenalkannya . Ini bekerja dengan:
Jadi, misalnya, definisi fungsi ini:
diubah menjadi teks bantuan optparse ini:
sumber
Saya suka getopt dari stdlib, mis:
Akhir-akhir ini saya telah membungkus sesuatu yang serupa dengan ini untuk membuat hal-hal yang kurang verbose (misalnya; membuat "-h" tersirat).
sumber
Pocoo ini klik lebih intuitif, memerlukan lebih sedikit boilerplate, dan setidaknya sekuat argparse.
Satu-satunya kelemahan yang saya temui sejauh ini adalah bahwa Anda tidak dapat melakukan banyak penyesuaian untuk membantu halaman, tetapi itu biasanya bukan keharusan dan mendiagnosis tampaknya merupakan pilihan yang jelas ketika itu.
sumber
Seperti yang Anda lihat di optparse "Modul optparse tidak digunakan lagi dan tidak akan dikembangkan lebih lanjut; pengembangan akan dilanjutkan dengan modul argparse ."
sumber
sumber
Anda mungkin tertarik pada modul Python kecil yang saya tulis untuk membuat penanganan argumen baris perintah menjadi lebih mudah (open source dan bebas digunakan) - Commando
sumber
Saya sarankan melihat docopt sebagai alternatif sederhana untuk yang lain ini.
docopt adalah proyek baru yang bekerja dengan mem-parsing pesan penggunaan --help Anda daripada mengharuskan Anda untuk mengimplementasikan semuanya sendiri. Anda hanya perlu meletakkan pesan penggunaan Anda dalam format POSIX.
sumber
Namun pilihan lain adalah argh . Itu dibangun berdasarkan argparse, dan memungkinkan Anda menulis hal-hal seperti:
Ini akan secara otomatis menghasilkan bantuan dan sebagainya, dan Anda dapat menggunakan dekorator untuk memberikan panduan tambahan tentang bagaimana arg-parsing seharusnya bekerja.
sumber
argh
lebih mudah daripada lib lain atau menggunakansys
.argh
tetapi itu tidak terlalu cocok untuk skenario di mana keinginan Anda yang terbaik adalah untuk tidak memiliki perintah dengan sub-perintah.def frobnicate_spleches(...)
mendefinisikan fungsi yang melakukan apa pun yang dilakukan skrip Anda, lalu lakukanif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
di akhir file.Solusi saya adalah entrypoint2 . Contoh:
teks bantuan:
sumber