python - Argparse con el subparser requerido
python-3.4 (1)
Necesitas darles a los subparsers
un 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 de ''faltantes argumentos'', el código necesita dar 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 SO que enlazó.
Uno de los pocos ''parches'' de argparse
en el último lanzamiento de Python cambió la manera en que prueba los argumentos ''requeridos''. Desafortunadamente, introdujo este error con respecto a los subparsers. Esto debe corregirse 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 Argparse Module con Python 2.7
Ha habido alguna actividad reciente en el error / problema relacionado
https://bugs.python.org/issue9253
actualizar
Una solución a esto está en proceso: https://github.com/python/cpython/pull/3027
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 subpagrama / subprograma ) Recibiré 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
- full rastrear:
$ python3 subparser_test.py
Traceback (most recent call last):
File "subparser_test.py", line 17, in <module>
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 programa 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?