metavar - argparse python example
argparse: identificar qué subparser se utilizó (2)
Una solución más simple es agregar dest
a la llamada add_subparsers
. Esto está enterrado un poco más abajo en la add_subparsers() :
[...] Si es necesario verificar el nombre del subparser que se invocó, el argumento de la palabra clave dest para la llamada add_subparsers () funcionará
En tu ejemplo, reemplaza:
subparsers = parser.add_subparsers(help=''commands'')
con:
subparsers = parser.add_subparsers(help=''commands'', dest=''command'')
Ahora si corres:
print parser.parse_args(["all"])
conseguirás
Namespace(command=''all'')
Esta pregunta ya tiene una respuesta aquí:
- Obtener el subcomando seleccionado con argparse 2 respuestas
Creo que esto debe ser fácil, pero no lo entiendo.
Supongamos que tengo el siguiente analizador arparse:
import argparse
parser = argparse.ArgumentParser( version=''pyargparsetest 1.0'' )
subparsers = parser.add_subparsers(help=''commands'')
# all
all_parser = subparsers.add_parser(''all'', help=''process all apps'')
# app
app_parser = subparsers.add_parser(''app'', help=''process a single app'')
app_parser.add_argument(''appname'', action=''store'', help=''name of app to process'')
¿Cómo puedo identificar, qué subparser fue utilizado? vocación:
print parser.parse_args(["all"])
me da un espacio de nombre vacío:
Namespace()
Editar: Consulte la respuesta de quornian a esta pregunta, que es mejor que la mía y debería ser la respuesta aceptada.
De acuerdo con la documentación de argparse, el resultado de parser.parse_args(...)
"solo contendrá atributos para el analizador principal y el analizador secundario que se seleccionó". Desafortunadamente, esta información puede no ser suficiente para determinar qué sub-analizador se utilizó. La documentación recomienda utilizar el set_defaults(...)
en el analizador secundario para resolver este problema.
Por ejemplo, agregué llamadas a set_defaults()
a su código:
import argparse
parser = argparse.ArgumentParser( version=''pyargparsetest 1.0'' )
subparsers = parser.add_subparsers(help=''commands'')
# all
all_parser = subparsers.add_parser(''all'', help=''process all apps'')
all_parser.set_defaults(which=''all'')
# app
app_parser = subparsers.add_parser(''app'', help=''process a single app'')
app_parser.add_argument(''appname'', action=''store'', help=''name of app to process'')
app_parser.set_defaults(which=''app'')
Ahora si corres
print parser.parse_args(["all"])
El resultado es
Namespace(which=''all'')
Consulte la documentación de add_subparsers()
para obtener más información y otro ejemplo.