Jawaban ini datang dari Steven Bethard di grup Google . Saya memposting ulang di sini untuk memudahkan orang tanpa akun Google untuk mengakses.
Anda dapat mengganti perilaku default error
metode:
import argparse
import sys
class MyParser(argparse.ArgumentParser):
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()
Perhatikan bahwa solusi di atas akan mencetak pesan bantuan setiap kali error
metode ini dipicu. Misalnya, test.py --blah
akan mencetak pesan bantuan juga jika --blah
bukan opsi yang valid.
Jika Anda ingin mencetak pesan bantuan hanya jika tidak ada argumen yang diberikan pada baris perintah, maka mungkin ini masih cara termudah:
import argparse
import sys
parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
parser.print_help(sys.stderr)
sys.exit(1)
args=parser.parse_args()
Perhatikan bahwa parser.print_help()
mencetak ke stdout secara default. Seperti yang disarankan init_js , gunakan parser.print_help(sys.stderr)
untuk mencetak ke stderr.
parser.print_usage()
sebagai penggantiparser.print_help()
- pesan bantuan termasuk penggunaan tetapi lebih bertele-tele.error()
tampaknya ide yang buruk bagi saya. Ini melayani tujuan yang berbeda, ini tidak dirancang untuk mencetak penggunaan atau bantuan yang ramah.Alih-alih menulis kelas, coba / kecuali dapat digunakan sebagai gantinya
Keuntungannya adalah alur kerja lebih jelas dan Anda tidak perlu kelas rintisan. Kelemahannya adalah baris 'penggunaan' pertama dicetak dua kali.
Ini membutuhkan setidaknya satu argumen wajib. Tanpa argumen wajib, memberikan nol argumen di baris perintah valid.
sumber
-h
flag digunakan, dan cetakan yang tidak perlu membantu jika--version
flag digunakan. Untuk mengurangi masalah-masalah tersebut Anda dapat memeriksa jenis kesalahan seperti ini:except SystemExit as err: if err.code == 2: parser.print_help()
Dengan argparse yang bisa Anda lakukan:
sumber
parser.parse_args()
Jika Anda memiliki argumen yang harus ditentukan untuk menjalankan skrip - gunakan parameter yang diperlukan untuk ArgumentParser seperti yang ditunjukkan di bawah ini: -
parse_args () akan melaporkan kesalahan jika skrip dijalankan tanpa argumen.
sumber
Jika Anda mengaitkan fungsi default untuk (sub) parser, seperti yang disebutkan di bawah
add_subparsers
, Anda bisa menambahkannya sebagai tindakan default:Tambahkan coba-kecuali jika Anda mengajukan pengecualian karena argumen posisi hilang.
sumber
Solusi terbersih adalah dengan memberikan argumen default secara manual jika tidak ada yang diberikan pada baris perintah:
Contoh lengkap:
Ini akan mencetak bantuan lengkap (bukan penggunaan singkat) jika dipanggil tanpa argumen.
sumber
sys.argv[1:]
adalah ungkapan yang sangat umum. Saya melihatparser.parse_args(None if sys.argv[1:] else ['-h'])
lebih idiomatik dan lebih bersih.Melemparkan versi saya ke tumpukan di sini:
Anda mungkin memperhatikan
parser.exit
- Saya terutama melakukannya karena menyimpan garis impor jika itu satu-satunya alasansys
dalam file ...sumber
not vars(args)
mungkin tidak berfungsi ketika argumen memilikidefault
metode.Ada sepasang one-liner dengan
sys.argv[1:]
(idiom Python yang sangat umum untuk merujuk argumen baris perintah, menjadisys.argv[0]
nama skrip) yang dapat melakukan pekerjaan.Yang pertama cukup jelas, bersih dan pythonic:
Yang kedua adalah peretas kecil. Menggabungkan fakta yang dievaluasi sebelumnya bahwa daftar kosong
False
denganTrue == 1
danFalse == 0
ekuivalen Anda dapatkan ini:Mungkin terlalu banyak tanda kurung, tetapi cukup jelas jika pemilihan argumen sebelumnya dibuat.
sumber
The
parser.exit
Metode juga menerimastatus
(returnCode), danmessage
nilai (termasuk baris baru sendiri!).contoh yang disarankan, :)
Contoh panggilan:
sumber
Tetapkan argumen posisional Anda dengan nargs, dan periksa apakah argumen posisional kosong.
Referensi Python nargs
sumber
Berikut adalah cara lain untuk melakukannya, jika Anda memerlukan sesuatu yang fleksibel di mana Anda ingin menampilkan bantuan jika params tertentu dilewati, tidak ada sama sekali atau lebih dari 1 argumen yang saling bertentangan:
Bersulang!
sumber
Jika perintah Anda adalah sesuatu di mana pengguna perlu memilih beberapa tindakan, maka gunakan grup yang saling eksklusif dengan wajib = Benar .
Ini adalah semacam ekstensi untuk jawaban yang diberikan oleh pd321.
Keluaran:
Ini hanya memberikan bantuan dasar. Dan beberapa jawaban lain akan memberi Anda bantuan penuh. Tapi setidaknya pengguna Anda tahu mereka bisa melakukan -h
sumber
Ini tidak baik (juga, karena mencegat semua kesalahan), tetapi:
Berikut adalah definisi
error
fungsiArgumentParser
kelas:https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Seperti yang Anda lihat, mengikuti tanda tangan, dibutuhkan dua argumen. Namun, fungsi di luar kelas tidak ada yang tahu tentang argumen pertama:,
self
karena, secara kasar, ini adalah parameter untuk kelas. (Aku tahu, bahwa Anda tahu ...) demikian, hanya lulus sendiriself
danmessage
di_error(...)
tidak bisa (akan menampilkan:
). Anda dapat meneruskan
parser
(self
) dalam_error
fungsi, dengan memanggilnya:, tetapi Anda tidak ingin keluar dari program, sekarang. Kemudian kembalikan:
. Meskipun demikian,
parser
tidak tahu, bahwa itu telah dimodifikasi, sehingga ketika kesalahan terjadi, itu akan mengirimkan penyebabnya (omong-omong, terjemahannya yang dilokalkan). Nah, lalu sadap saja:. Sekarang, ketika kesalahan terjadi dan
parser
akan mengirimkan penyebabnya, Anda akan mencegatnya, lihat ini, dan ... buang.sumber