Argparse con subparser requerido

Estoy usando Python 3.4, estoy tratando de usar argparse con subparsers, y quiero tener un comportamiento similar al de Python 2.x donde si no proporciono un argumento posicional (para indicar el subparser / subprogtwig ) Obtendré un mensaje de error útil. Es decir, con python2 obtendré el siguiente mensaje de error:

 $ python2 subparser_test.py usage: subparser_test.py [-h] {foo} ... subparser_test.py: error: too few arguments 

Estoy configurando el atributo required como se sugiere en https://stackoverflow.com/a/22994500/3061818 , sin embargo, eso me da un error con Python 3.4.0: TypeError: sequence item 0: expected str instance, NoneType found – completo rastrear:

 $ python3 subparser_test.py Traceback (most recent call last): File "subparser_test.py", line 17, in  args = parser.parse_args() File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args args, argv = self.parse_known_args(args, namespace) File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args namespace, args = self._parse_known_args(args, namespace) File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, in _parse_known_args ', '.join(required_actions)) TypeError: sequence item 0: expected str instance, NoneType found 

Este es mi progtwig subparser_test.py – adaptado de https://docs.python.org/3.2/library/argparse.html#sub-commands :

 import argparse # sub-command functions def foo(args): print('"foo()" called') # create the top-level parser parser = argparse.ArgumentParser() subparsers = parser.add_subparsers() subparsers.required = True # create the parser for the "foo" command parser_foo = subparsers.add_parser('foo') parser_foo.set_defaults(func=foo) args = parser.parse_args() args.func(args) 

Pregunta relacionada: ¿Por qué este código argparse se comporta de manera diferente entre Python 2 y 3?

Related of "Argparse con subparser requerido"

Necesitas dar un subparsers a los subparsers .

 parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='cmd') subparsers.required = True 

Ahora:

 1909:~/mypy$ argdev/python3 stack23349349.py usage: stack23349349.py [-h] {foo} ... stack23349349.py: error: the following arguments are required: cmd 

Para emitir este mensaje de error ‘argumentos faltantes’, el código debe asignar un nombre a ese argumento. Para un argumento posicional (como subparses), ese nombre es (por defecto) el ‘dest’. Hay una nota (menor) sobre esto en la respuesta de SO que has vinculado

Uno de los pocos ‘parches’ a argparse en la última versión de Python cambió la forma en que prueba los argumentos ‘requeridos’. Desafortunadamente introdujo este error con respecto a subparsers. Esto debe solucionarse en la próxima versión (si no antes).

actualizar

Si desea este comportamiento de subparsers opcional en Py2, parece que la mejor opción es usar un analizador de dos etapas como se describe en

Cómo establecer un subparser predeterminado usando el módulo Argparse con Python 2.7

Ha habido alguna actividad reciente en el problema / problema relacionado

https://bugs.python.org/issue9253

actualizar

Una solución para esto está en los trabajos: https://github.com/python/cpython/pull/3027