106

私が必要とするのは:

pro [-a xxx | [-b yyy -c zzz]]

これを試しましたが、うまくいきません。誰か助けてくれませんか?

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")

ありがとう!

4

4 に答える 4

118

add_mutually_exclusive_groupグループ全体を相互に排他的にするわけではありません。グループ内のオプションを相互に排他的にします。

あなたが探しているのはsubcommandsです。prog の代わりに [ -a xxxx | [-b yyy -c zzz]] の場合:

prog 
  command 1 
    -a: ...
  command 2
    -b: ...
    -c: ...

引数の最初のセットで呼び出すには:

prog command_1 -a xxxx

2 番目の引数セットを使用して呼び出すには、次のようにします。

prog command_2 -b yyyy -c zzzz

サブコマンドの引数を定位置として設定することもできます。

prog command_1 xxxx

git や svn のようなもの:

git commit -am
git merge develop

実施例

# 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', dest="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')

試して

>>> 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(subcommand='command_1', 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

幸運を。

于 2013-07-28T14:59:21.187 に答える
4

これを可能にする python パッチ (開発中) があります。
http://bugs.python.org/issue10984

アイデアは、重複する相互に排他的なグループを許可することです。したがってusage、次のようになります。

pro [-a xxx | -b yyy] [-a xxx | -c zzz]

このように 2 つのグループを作成できるように argparse コードを変更するのは簡単でした。usage書式設定コードを変更するには、カスタム を作成する必要がありましたHelpFormatter

ではargparse、アクション グループは解析に影響しません。それらは単なるhelpフォーマットツールです。ではhelp、相互に排他的なグループは回線にのみ影響しusageます。解析時に、は相互に排他的なグループを使用して潜在的な競合 (またはでは発生できない、 では発生できないなど)parserの辞書を作成し、競合が発生した場合はエラーを発生させます。abcba

parse_argsその argparse パッチがなければ、自分で生成した名前空間をテストし (たとえば、 と の両方abデフォルト以外の値がある場合)、独自のエラーを発生させるのが最善の選択だと思います。パーサー独自のエラー メカニズムを使用することもできます。

parser.error('custom error message')
于 2013-07-30T07:19:53.097 に答える
0

サブパーサーが必要ない場合は、現在、相互に排他的なグループを使用してこれを行うことができますが、これにはプライベート変数へのアクセスが含まれるため、自己責任で使用してください。アイデアは、 and と-a相互に排他的になりたいが、 and と相互に排他的になりたくないということです-b-c-b-c

import argparse
p = argparse.ArgumentParser()

# first set up a mutually exclusive group for a and b
g1 = p.add_mutually_exclusive_group()
arg_a = g1.add_argument('-a')  # save this _StoreAction for later
g1.add_argument('-b')

# now set up a second group for a and c 
g2 = p.add_mutually_exclusive_group()
g2.add_argument('-c')
g2._group_actions.append(arg_a)  # this is the magic/hack

これで、 と の両方に排他-a的になりました。-c-b

a = p.parse_args(['-a', '1'])
# a.a = 1, a.b = None, a.c = None

a = p.parse_args(['-a', '1', '-b', '2'])
# usage: prog.py [-h] [-a A | -b B] [-c C]
# prog.py: error: argument -b: not allowed with argument -a

ヘルプメッセージを台無しにすることに注意してください。ただし、おそらくそれをオーバーライドするか、必要な機能を備えているため無視することができます。これはおそらくより重要です。

b と c のいずれかを使用しているかどうかを確認したい場合は、両方を使用する必要がありますrequired=True。相互に排他的なグループをインスタンス化するときにキーワード arg を追加するだけです。

于 2022-01-13T18:56:34.570 に答える