web-dev-qa-db-ja.com

argparseサブパーサーを正しく使用するには?

私はここと一般にサブパーサーの例をすべて探してきましたが、この一見単純なことを理解することはできないようです。

私は2つのvar型を持っていますが、そのうちの1つには制約がありますので、サブパーサーが行く方法だと考えました。例えば-tは、「A」または「B」のいずれかを許可します。ユーザーが「A」を渡す場合、「a1」か「a2」のどちらかを指定する必要があります。 「B」だけを渡すと、何もありません。

これを行うと、argparseがどのタイプの "A"が渡されたのか、または単に "B"だったのかを返すことができますか?

以下は動作しているようですが、何らかの理由でサブパース後に何かを渡すと壊れます。

例えばLinuxターミナルから

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

エラー...

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

うまくいけば、それは理にかなっています。

コード:

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
46
user1571144

サブパーサーは最初のpositional引数の値に基づいて呼び出されるため、呼び出しは次のようになります

python test01.py A a1 -v 61

「A」は、適切なサブパーサーをトリガーします。サブパーサーは、位置引数と-vオプション。

argparseは引数とオプションの出現順序に制限を課していないため、解析が開始されるとどの引数/オプションmayを出現させるかを変更する簡単な方法はないためです(パーサーインスタンスを変更するカスタムアクションを含む何かが機能する可能性があります)、-t自体:

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'])

-vはメインパーサーに対して定義されます。指定する必要がありますbefore残りの引数に使用するサブパーサーを指定する引数。

50
chepner