Soy un problema para un proyecto escolar. Estoy haciendo un traje de prueba y necesito bot una interfaz de generación de configuración y un corredor de prueba. Para eso usé la biblioteca argparse y dos run cgi y ejecuté
Así que aquí está la sección de código que falla:
def CGI(args): print("CGI: Work In Progress") exit(0) def runTest(args): print("Run: Work in Progress") exit(0) parser = argparse.ArgumentParser() subparser = parser.add_subparsers() cgi = subparser.add_parser("cgi", help="CSV Generator Interface") run = subparser.add_parser("run", help="Test running") verbosity = parser.add_argument_group("Verbosity").add_mutually_exclusive_group() check = run.add_argument_group("Checks") # Arguments #Run parser run.set_defaults(func=runTest) # Run argument declaration ... # Verbosity argument declaration ... # Check argument declaration ... #CGI cgi.set_defaults(func=CGI) args = parser.parse_args() args.func(args) # Error is hereCada vez que ejecuto este código tengo el siguiente error:
File "/home/thor/Projects/EPITA/TC/test/test.py", line 44, in main args.func(args) AttributeError: 'Namespace' object has no attribute 'func' $ python -V Python 3.6.4 $ pip show argparse Name: argparse Version: 1.4.0 Summary: Python command-line parsing library Home-page: https://github.com/ThomasWaldmann/argparse/ Author: Thomas Waldmann Author-email: tw@waldmann-edv.de License: Python Software Foundation License Location: /usr/lib/python3.6/site-packages Requires: Si instalo argparse manualmente, funciona sudo pip install argparse . Pero, ¿hay alguna solución nativa? No estoy seguro de que funcione en las computadoras de la escuela (no podemos instalar paquetes)
OK, mi error, he sido un completo idiota, no reescribí mi script en ejecución, así que olvidé ingresar run o cgi
Gracias por leer mi mensaje y por su futura ayuda :)
Este es un error conocido en la versión Python 3 de argparse ( https://bugs.python.org/issue16308 ). En Python 2, si se llama al script sin ningún tipo de argumento (es decir, sin subcomando), sale limpiamente con "error: muy pocos argumentos". En Python3, sin embargo, obtienes un AttributeError no controlado. Afortunadamente, la solución es bastante sencilla:
try: func = args.func except AttributeError: parser.error("too few arguments") func(args)parser = ArgumentParser() parser.set_defaults(func=lambda args: parser.print_help())en mi humilde opinión, mejor que intentar ... excepto
Otra solución podría ser:
if len(args.__dict__) <= 1: # No arguments or subcommands were given. parser.print_help() parser.exit()