Solo una opción de línea de comando con Argparse
Pregunta
Estoy tratando de crear una CLI con el módulo Argparse, pero me gustaría tener diferentes comandos con diferentes requisitos de argumentos, probé esto:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo', help='foo help')
parser.add_argument('test', nargs=1, help='test help')
args = parser.parse_args()
Lo que me gustaría es poder correr python test.py foo
y python test.py test somearg
Pero cuando corro python test.py foo
yo obtengo error: too few arguments
. ¿Hay alguna forma de que los comandos puedan comportarse como git status
, git commit
o pip install
? ¿O hay una mejor manera de crear un CLI en Python?
Solución
Esto es lo que probablemente quieras:
http://docs.python.org/library/argparse.html#sub-commands
Con esto, puede agregar sub argumentos que tienen sus propios esquemas de argumentos.
Otros consejos
@CrodJer es correcto;
Para proporcionar un ejemplo:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands',
description='valid subcommands',
help='additional help')
foo_parser = subparsers.add_parser('foo', help='foo help')
bar_parser = subparsers.add_parser('bar', help='bar help')
bar_parser.add_argument('somearg')
args = parser.parse_args()
Prueba de diferentes args por subparrador:
$ python subparsers_example.py bar somearg Namespace(somearg='somearg') $ python subparsers_example.py foo Namespace() $ python subparsers_example.py foo somearg usage: argparse_subparsers.py foo [-h] subparser_example.py foo: error: unrecognized arguments: somearg
Ayuda de salida:
$ python subparsers_example.py foo -h usage: argparse_subparsers.py foo [-h] optional arguments: -h, --help show this help message and exit $ python subparsers_example.py bar -h usage: argparse_subparsers.py bar [-h] somearg positional arguments: somearg optional arguments: -h, --help show this help message and exit
Por defecto, los argumentos de Argparse consumen un valor. Si desea que FOO tenga un comportamiento diferente, deberá especificarlo. Parece que crees que el valor predeterminado es nargs = 0, pero no lo es. De la documentación de Argparse (en http://docs.python.org/dev/library/argparse.html#nargs): "Si no se proporciona el argumento de palabras clave NARGS, el número de ARG consumidos está determinado por la acción. Generalmente esto significa que se consumirá una sola línea de comandos y se consumirá un solo elemento (no una lista)".
Puedes usar nargs = '?' para Foo y dale un valor predeterminado en caso de que no se proporcione nada desde la línea de comandos, o use una acción no deformenta (¿quizás 'store_true'?).