Yang saya butuhkan adalah:
pro [-a xxx | [-b yyy -c zzz]]
Saya mencoba ini tetapi tidak berhasil. Bisakah seseorang membantu saya?
group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")
Terima kasih!
Jawaban:
add_mutually_exclusive_group
tidak membuat seluruh grup saling eksklusif. Itu membuat opsi dalam grup menjadi eksklusif.Apa yang Anda cari adalah subperintah . Alih-alih prog [-a xxxx | [-b yyy -c zzz]], Anda akan memiliki:
prog command 1 -a: ... command 2 -b: ... -c: ...
Untuk memanggil dengan set argumen pertama:
Untuk memanggil dengan set argumen kedua:
Anda juga dapat mengatur argumen sub perintah sebagai posisi.
Jenis suka git atau svn:
Contoh Kerja
# create the top-level parser parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo', action='store_true', help='help for foo arg.') subparsers = parser.add_subparsers(help='help for subcommand') # create the parser for the "command_1" command parser_a = subparsers.add_parser('command_1', help='command_1 help') parser_a.add_argument('a', type=str, help='help for bar, positional') # create the parser for the "command_2" command parser_b = subparsers.add_parser('command_2', help='help for command_2') parser_b.add_argument('-b', type=str, help='help for b') parser_b.add_argument('-c', type=str, action='store', default='', help='test')
Menguji
>>> parser.print_help() usage: PROG [-h] [--foo] {command_1,command_2} ... positional arguments: {command_1,command_2} help for subcommand command_1 command_1 help command_2 help for command_2 optional arguments: -h, --help show this help message and exit --foo help for foo arg. >>> >>> parser.parse_args(['command_1', 'working']) Namespace(a='working', foo=False) >>> parser.parse_args(['command_1', 'wellness', '-b x']) usage: PROG [-h] [--foo] {command_1,command_2} ... PROG: error: unrecognized arguments: -b x
Semoga berhasil.
sumber
[[-a <val>] | [-b <val1> -c <val2>]]
[-a xxx | [-b yyy -c zzz]]
Meskipun jawaban Jonathan baik-baik saja untuk opsi yang kompleks, ada solusi yang sangat sederhana yang akan berfungsi untuk kasus sederhana, misalnya 1 opsi mengecualikan 2 opsi lain seperti di
atau bahkan seperti pada pertanyaan awal:
Inilah cara saya melakukannya:
parser = argparse.ArgumentParser() # group 1 parser.add_argument("-q", "--query", help="query", required=False) parser.add_argument("-f", "--fields", help="field names", required=False) # group 2 parser.add_argument("-a", "--aggregation", help="aggregation", required=False)
Saya menggunakan opsi di sini yang diberikan ke pembungkus baris perintah untuk menanyakan mongodb. Itu
collection
contoh baik dapat memanggil metodeaggregate
atau metodefind
dengan argumen opsionalquery
danfields
, karenanya Anda melihat mengapa dua argumen pertama yang kompatibel dan yang terakhir adalah tidak.Jadi sekarang saya menjalankan
parser.parse_args()
dan memeriksa isinya:args = parser().parse_args() print args.aggregation if args.aggregation and (args.query or args.fields): print "-a and -q|-f are mutually exclusive ..." sys.exit(2)
Tentu saja, peretasan kecil ini hanya berfungsi untuk kasus-kasus sederhana dan akan menjadi mimpi buruk untuk memeriksa semua opsi yang memungkinkan jika Anda memiliki banyak opsi dan grup yang saling eksklusif. Dalam hal ini Anda harus membagi pilihan Anda menjadi kelompok perintah seperti yang disarankan Jonathan.
sumber
parser.error("-a and -q ...")
. Dengan cara ini bantuan penggunaan lengkap akan dicetak secara otomatis.q
danf
diperlukan di grup pertama adalah pengguna, (2) grup mana pun diperlukan. Dan ini membuat solusi "sederhana" tidak sesederhana itu lagi. Jadi saya setuju bahwa ini lebih merupakan retasan untuk skrip buatan tangan, tetapi bukan solusi nyataAda patch python (dalam pengembangan) yang memungkinkan Anda melakukan ini.
http://bugs.python.org/issue10984
Idenya adalah untuk memungkinkan tumpang tindih kelompok yang saling eksklusif. Jadi
usage
mungkin terlihat seperti:Mengubah kode argparse sehingga Anda dapat membuat dua grup seperti ini adalah bagian yang mudah. Mengubah
usage
kode format diperlukan penulisan customHelpFormatter
.Di
argparse
, grup tindakan tidak memengaruhi penguraian. Mereka hanyalahhelp
alat pemformatan. Di dalamhelp
, kelompok yang saling eksklusif hanya mempengaruhiusage
garis. Saat mengurai,parser
penggunaan grup yang saling eksklusif untuk membuat kamus potensi konflik (a
tidak dapat terjadi denganb
atauc
,b
tidak dapat terjadi dengana
, dll), dan kemudian menimbulkan kesalahan jika konflik muncul.Tanpa patch argparse itu, menurut saya pilihan terbaik Anda adalah menguji namespace yang diproduksi
parse_args
sendiri (misalnya jika keduanyaa
danb
memiliki nilai nondefault), dan meningkatkan kesalahan Anda sendiri. Anda bahkan dapat menggunakan mekanisme kesalahan parser sendiri.parser.error('custom error message')
sumber