argparse con los subcomandos requeridos

Con el argparse de python, ¿cómo hago que un subcomando sea un argumento requerido? Quiero hacer esto porque quiero que argparse produzca un error si no se especifica un subcomando. Anulo el método de error para imprimir la ayuda en su lugar. Tengo subcomandos nesteds de 3 profundos, por lo que no se trata simplemente de manejar cero argumentos en el nivel superior.

En el siguiente ejemplo, si esto se llama así, obtengo:

$./simple.py $ 

Lo que quiero que haga en su lugar es que argparse se queje de que no se especificó el subcomando requerido:

 import argparse class MyArgumentParser(argparse.ArgumentParser): def error(self, message): self.print_help(sys.stderr) self.exit(0, '%s: error: %s\n' % (self.prog, message)) def main(): parser = MyArgumentParser(description='Simple example') subs = parser.add_subparsers() sub_one = subs.add_parser('one', help='does something') sub_two = subs.add_parser('two', help='does something else') parser.parse_args() if __name__ == '__main__': main() 

Hubo un cambio en 3.3 en el mensaje de error para los argumentos requeridos, y los subcomandos se perdieron en el polvo.

http://bugs.python.org/issue9253#msg186387

Allí sugiero esto alrededor, estableciendo el atributo required después de que se subparsers los subparsers .

 parser = ArgumentParser(prog='test') subparsers = parser.add_subparsers() subparsers.required = True subparsers.dest = 'command' subparser = subparsers.add_parser("foo", help="run foo") parser.parse_args() 

actualizar

Una solicitud de extracción relacionada: https://github.com/python/cpython/pull/3027

¿Qué hay de usar required=True ? Más información aquí .

Puede usar el argumento dest , que se documenta en el último ejemplo de la documentación para add_subparsers() :

 # required_subparser.py import argparse parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subparser_name') one = subparsers.add_parser('one') two = subparsers.add_parser('two') args = parser.parse_args() 

Corriendo:

 $python required_subparser.py usage: required_subparser.py [-h] {one,two} ... required_subparser.py: error: too few arguments $python required_subparser.py one $# no error