1. ホーム
  2. python

[解決済み] Python argparse - 複数のサブパーサーに引数を追加する

2023-06-09 05:19:18

質問

私のスクリプトでは、1つのメインパーサーと複数のサブパーサーを定義しています。私は -p 引数をいくつかのサブパーサーに適用したいのです。今のところ、コードは次のようになっています。

parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")

parser.add_argument("-v", "--verbose",
                    action="store_true",
                    dest="VERBOSE",
                    help="run in verbose mode")

parser_create = subparsers.add_parser ("create", 
                                        help = "create the orbix environment")
parser_create.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

# Update
parser_update = subparsers.add_parser ("update", 
                                        help = "update the orbix environment")
parser_update.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

ご覧のように add_arument ("-p") が2回繰り返されていることがわかります。実際にはもっとたくさんのサブパーサーがあります。繰り返しを避けるために、既存のサブパーサーをループする方法はありますか?

記録のために、私はPython 2.7を使用しています。

どのように解決するのですか?

これを実現するには 親パーサ を定義することで実現できます。

import argparse

parent_parser = argparse.ArgumentParser(description="The parent parser")
parent_parser.add_argument("-p", type=int, required=True,
                           help="set db parameter")
subparsers = parent_parser.add_subparsers(title="actions")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
                                      add_help=False,
                                      description="The create parser",
                                      help="create the orbix environment")
parser_create.add_argument("--name", help="name of the environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
                                      add_help=False,
                                      description="The update parser",
                                      help="update the orbix environment")

という形式のヘルプメッセージを生成します。

parent_parser.print_help()

出力します。

usage: main.py [-h] -p P {create,update} ...
The parent parser
optional arguments:
  -h, --help       show this help message and exit
  -p P             set db parameter
actions:
  {create,update}
    create         create the orbix environment
    update         update the orbix environment

parser_create.print_help()

出力します。

usage: main.py create [-h] -p P [--name NAME] {create,update} ...
The create parser
optional arguments:
  -h, --help       show this help message and exit
  -p P             set db parameter
  --name NAME      name of the environment
actions:
  {create,update}
    create         create the orbix environment
    update         update the orbix environment

しかし、プログラムを実行した場合、アクションを指定しなければエラーになりません(つまり create または update ). このような動作をさせたい場合は、以下のようにコードを修正してください。

<...>
subparsers = parent_parser.add_subparsers(title="actions")
subparsers.required = True
subparsers.dest = 'command'
<...>

この修正は このSOの質問 という、プルリクエストを追跡している問題を参照しています。

更新者 @hpaulj

2011年以降のサブパーサーの扱いに関する変更により、メインパーサーを parent . より一般的には、同じ引数を定義しようとしないことです(同じ dest を定義しようとしないでください。 サブパーサーの値はメインで設定されたものを上書きしてしまいます(たとえサブパーサーの default もこれを行います)。 として使用するために別のパーサーを作成します。 parents . そして、ドキュメントに示されているように、親は add_help=False .