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 someargPero 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?

¿Fue útil?

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'?).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top