argparse: no se puede obtener el nombre del subpaseador después de declarar un argumento global.
Tengo un analizador sintáctico con algunos subanalizadores. Configuré un argumento global para ser utilizado en todos los subanalizadores. Aquí está el fragmento relevante:
parser = argparse.ArgumentParser(prog="my_prog", add_help=False)
parser.add_argument('-d', '--debug', action='store_true', help='debug flag')
subparsers = parser.add_subparsers(dest="subparser_name", help='some help notes')
parser_cmd1 = subparsers.add_parser('cmd1', parents=[parser])
parser_cmd1.add_argument('-f', '-foo', type=str, action=foo, required=False, help='foo command')
parser_cmd2 = subparsers.add_parser('cmd2', parents=[parser])
parser_cmd2.add_argument('-b', '-bar', type=str, action=bar, required=False, help='bar command')
args = parser.parse_args()
parser = args.subparser_name
print(args)
if args.debug:
logging.basicConfig(level=logging.INFO)
if parser == 'cmd1':
if args.foo:
//do foo stuff
if parser == 'cmd2':
if args.bar:
//do bar stuff
Así que puedes usar un comando como tal my_prog.py cmd1 -d -f input_str
. Aquí está el problema: subparser_name es Nulo. La salida de print(args) se ve algo así:
Namespace(debug=True, foo="input_str", subparser_name=None)
Antes de agregar el argumento global de depuración, subparser_name sería el nombre del comando que ejecuté, es decir, ‘cmd1’ o ‘cmd2’. Ahora, es ‘None’. Incluso con la adición de parents=[parser] en la creación del subanalizador. ¿Cómo puedo arreglar esto? ¿Cómo sé qué comando se llamó?
davy.ai
El problema está con el orden de análisis de los argumentos. Ya que el argumento global se agrega antes de la creación de los subparsers, se analiza antes de que se determine el subparser_name. Para solucionar esto, el argumento global debería agregarse después de la creación de los subparsers como se muestra a continuación:
Ahora, el subparser_name debería analizarse correctamente y mostrarse en la salida de print(args).