Mon script définit un analyseur principal et plusieurs analyseurs secondaires. Je souhaite appliquer l'argument -p
À certains sous-analyseurs. Jusqu'à présent, le code ressemble à ceci:
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")
Comme vous pouvez le voir, la add_arument ("-p")
est répétée deux fois. J'ai en fait beaucoup plus de sous-analyseurs. Existe-t-il un moyen de parcourir les sous-analyseurs existants afin d'éviter la répétition?
Pour mémoire, j'utilise Python 2.7
Ceci peut être réalisé en définissant un analyseur parent contenant les options communes:
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")
Cela génère des messages d'aide au format:
parent_parser.print_help()
Production:
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()
Production:
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
Cependant, si vous exécutez votre programme, vous ne rencontrerez pas d'erreur si vous ne spécifiez pas d'action (c'est-à-dire create
ou update
). Si vous souhaitez ce comportement, modifiez votre code comme suit.
<...>
subparsers = parent_parser.add_subparsers(title="actions")
subparsers.required = True
subparsers.dest = 'command'
<...>
Ce correctif a été signalé dans this SO question qui fait référence à un problème de suivi d'une demande d'extraction.
Vous pouvez également faire une boucle sur les sous-analyseurs et ajouter la même option à chacun d'eux.
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_update = subparsers.add_parser ("update",
help = "update the orbix environment")
for subparser in [parser_create, parser_update]:
subparser.add_argument ("-p",
type = int,
required = True,
help = "set db parameter")
Vous pouvez parcourir vos sous-analyseurs de la manière suivante.
for name, subp in subparsers.choices.items():
print(subp)
subp.add_argument(dest='g', help='Input for g variable', default=7, type=int)
Notez qu'en utilisant subparsers.choices
que vous évitez d'avoir à coder en dur tous les sous-analyseurs.
réponse acceptée est correcte; la bonne façon est d'utiliser parseurs parents . Cependant, l'exemple de code IMO ne résolvait pas vraiment le problème. Permettez-moi d'ajouter mes quelques cents pour donner un exemple plus approprié.
La principale différence avec la réponse acceptée est la possibilité explicite d'avoir des arguments au niveau racine (comme --verbose
) ainsi que des arguments partagés uniquement pour certains sous-analyseurs (-p
uniquement pour les sous-paramètres create
et update
mais pas pour les autres)
# Same main parser as usual
parser = argparse.ArgumentParser()
# Usual arguments which are applicable for the whole script / top-level args
parser.add_argument('--verbose', help='Common top-level parameter',
action='store_true', required=False)
# Same subparsers as usual
subparsers = parser.add_subparsers(help='Desired action to perform', dest='action')
# Usual subparsers not using common options
parser_other = subparsers.add_parser("extra-action", help='Do something without db')
# Create parent subparser. Note `add_help=False` and creation via `argparse.`
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('-p', help='add db parameter', required=True)
# Subparsers based on parent
parser_create = subparsers.add_parser("create", parents=[parent_parser],
help='Create something')
# Add some arguments exclusively for parser_create
parser_update = subparsers.add_parser("update", parents=[parent_parser],
help='Update something')
# Add some arguments exclusively for parser_update
Il s'agit du message d'aide de niveau supérieur (notez que -p
n'est pas affiché ici, ce qui est exactement ce à quoi vous vous attendez, car il est spécifique à certains sous-analyseurs):
>>> parser.print_help()
usage: [-h] [--verbose] {extra-action,create,update} ...
positional arguments:
{extra-action,create,update}
Desired action to perform
extra-action Do something without db
create Create something
update Update something
optional arguments:
-h, --help show this help message and exit
--verbose Common top-level parameter
Et le message d'aide pour l'action create
:
>>> parser_create.print_help()
usage: create [-h] -p P
optional arguments:
-h, --help show this help message and exit
-p P add db parameter