Pertanyaan Bagaimana cara menggunakan argparse subparser dengan benar?


Saya telah mencari melalui membagikan contoh subparser di sini dan secara umum tetapi tampaknya tidak dapat memikirkan hal yang tampaknya sederhana ini.

Saya memiliki dua jenis var yang salah satunya memiliki kendala sehingga pemikiran subparser adalah cara yang tepat. misalnya -t memungkinkan untuk "A" atau "B". Jika pengguna melewati "A" maka mereka juga harus menentukan apakah "a1" atau "a2". Jika mereka hanya melewati "B" maka tidak ada apa-apa.

Bolehkah saya melakukan ini dan meminta argparse untuk mengembalikan saya jenis "A" apa yang dilewati atau apakah itu hanya "B"?

Di bawah ini tampaknya berfungsi tetapi untuk beberapa alasan istirahat ketika melewati apa pun setelah subparse.

misalnya dari terminal linux

>> python test01.py -t A a1 -v 61

kesalahan dengan ...

usage: test01.py a1 [-h]
test01.py a1: error: unrecognized arguments: -v

Semoga itu masuk akal.

Kode:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')

parser.add_argument("-t",
                    choices = ["A", "B"],
                    dest = "type",
                    required=True,
                    action='store',
                    help="Some help blah blah")

cam_parser = subparsers.add_parser('a1', help='Default')
cam_parser.set_defaults(which='a1')

cam_parser = subparsers.add_parser('a2', help='parse this instead of default')
cam_parser.set_defaults(which='a2')


parser.add_argument("-v",
                    nargs = '+',
                    required=True,
                    dest = "version",
                    type=int,
                    action='store',
                    help="some version help blah blah")   

argument = parser.parse_args()

print argument.type
print argument.version

32
2018-06-12 19:28


asal


Jawaban:


Subparser dijalankan berdasarkan nilai yang pertama posisional argumen, jadi panggilan Anda akan terlihat seperti

python test01.py A a1 -v 61

"A" memicu subparser yang sesuai, yang akan didefinisikan untuk memungkinkan argumen posisi dan -v pilihan.

Karena argparse tidak sebaliknya memberlakukan pembatasan pada urutan di mana argumen dan opsi dapat muncul, dan tidak ada cara sederhana untuk mengubah argumen / opsi apa mungkin muncul saat parsing telah dimulai (sesuatu yang melibatkan tindakan kustom yang mengubah contoh parser mungkin berfungsi), Anda harus mempertimbangkan untuk mengganti -t diri:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')
parser.add_argument("-v", ...)

a_parser = subparsers.add_parser("A")
b_parser = subparsers.add_parser("B")

a_parser.add_argument("something", choices=['a1', 'a2'])

Sejak -v didefinisikan untuk parser utama, harus ditentukan sebelum argumen yang menentukan mana subparser digunakan untuk argumen yang tersisa.


37
2018-06-12 19:59