Pregunta ¿Cómo usar los subparsores argparse correctamente?


He estado buscando en todos los ejemplos del subparser aquí y en general, pero parece que no me resulta fácil darme cuenta de esto.

Tengo dos tipos de var, uno de los cuales tiene restricciones, así que pensé que el subparser era el camino a seguir. p.ej. -t permite "A" o "B". Si el usuario aprueba "A", se le solicitará que especifique si es "a1" o "a2". Si pasan solo "B", entonces nada.

¿Puedo hacer esto y que argparse me devuelva qué tipo de "A" pasó o si solo era "B"?

Lo siguiente parece funcionar, pero por alguna razón se rompe al pasar cualquier cosa después de la sub-distribución.

p.ej. desde un terminal de linux

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

errores con ...

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

Espero que tenga sentido.

El código:

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


origen


Respuestas:


Los subparsers se invocan en función del valor de la primera posicional argumento, entonces su llamada se vería

python test01.py A a1 -v 61

La "A" activa el subparser apropiado, que se definiría para permitir un argumento posicional y el -v opción.

Porque argparse no impone ninguna restricción en el orden en que los argumentos y las opciones pueden aparecer, y no hay una manera simple de modificar qué argumentos / opciones mayo aparecerá una vez que haya comenzado el análisis (algo que involucre acciones personalizadas que modifiquen la instancia del analizador podría funcionar), debería considerar reemplazar -t sí mismo:

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

Ya que -v se define para el analizador principal, se debe especificar antes de el argumento que especifica qué subparser se usa para los argumentos restantes.


37
2018-06-12 19:59