2011-08-15 13 views
11

Aquí es un ejemplo de código:En python, ¿cómo hacer que los subparsers lean en el argumento del analizador padre?

import argparse 

parser=argparse.ArgumentParser() 
parser.add_argument('-main_arg') 
subparser=parser.add_subparser() 
a=subparser.add_parser('run') 
a.add_argument('required_sub_arg') 
a.add_argument('arg_a') 
b=subparser.add_parser('b') 
parser.parse_args() 

quiero que se lea en -main_arg si entro program run required_sub_arg -main_arg -arg_a

En este momento, no reconoce -main_arg como un argumento válido.

+0

¿main-arg está destinado a ser un argumento para el analizador principal o el subparser? – katrielalex

+0

main-arg es un argumento que se puede usar en cualquier subparser –

Respuesta

8

Mensaje de servicio a los lectores recientes

Como esta pregunta todavía tiene visitas en 2016, antes de hacer nada con este complejo argparse, por favor, considere el uso de docopt lugar. Mejorará tanto su cordura como la de cualquier persona que pueda leer o modificar su código. Gracias.

Respuesta original

Como es, usted tiene algunos problemas.

En primer lugar, parser.parse_args es un método que devuelve un espacio de nombres de argumentos parser 's, por lo que debe hacer algo como

args = parser.parse_args() 

Entonces args.main_args para obtener -main_arg de una llamada como

program -main_arg run required_sub_arg -arg_a 

Su problema con main_arg es que ha creado un argumento para parser nam ed main_arg, y realiza una llamada al igual que

program run required_sub_arg -main_arg -arg_a 

que hace referencia a un argumento a a llamado main_arg. Como a no tiene dicho argumento, no es válido.

Para hacer referencia al argumento de un analizador desde uno de sus subparser, debe hacer que dicho subparser herede los argumentos de su principal. Esto se hace con

a=parser.add_subparser('run', parents=[parser]) 

Ha confundido el subparser para el analizador hijo. Consulte http://docs.python.org/dev/py3k/library/argparse.html y https://code.google.com/p/argparse/issues/detail?id=54 para obtener más información.

+0

El código de ejecución I puesto arriba devuelve un error, diciendo que -main_arg no es un argumento válido. ¿Necesito 'parents = [parser]'? Puedo hacer cosas como, program -main_arg run required_sub_arg -arg_a pero can not, program run required_sub_arg -main_arg -arg_a –

+0

He editado la respuesta para que el problema sea más obvio. – Evpok

+0

Entonces, lo que add_subparser hacer es básicamente crear un nuevo ArgumentParser. Y cuando se llama a parse_arg, analiza los argumentos tanto del subparser como del analizador original ¿Qué ocurre si se llaman simultáneamente 2 subcomandos? –

Cuestiones relacionadas