2012-03-15 22 views
19

¿Hay un módulo de Python para haciendo argumentos de línea de comando gem/git-style? Lo que quiero decir con gem/git style es:argumentos de línea de comando gem/git-style en Python

$ ./MyApp.py 
The most commonly used MyApp commands are: 
    add  Add file contents to the index 
    bisect  Find by binary search the change that introduced a bug 
    branch  List, create, or delete branches 
    checkout Checkout a branch or paths to the working tree 
    ... 

$ ./MyApp.py branch 
    * current-branch 
    master 

Sin argumentos, la salida le indica cómo puede continuar. Y hay un comando especial de "ayuda":

$ ./MyApp.py help branch 

que te lleva consejos más profundas sobre el comando "rama".

Editar: Y por haciendo quiero decir que realiza la impresión de uso para usted, sale con una entrada no válida, se ejecuta sus funciones de acuerdo con su especificación CLI. Tipo de un "mapeador de URL" para la línea de comando.

Respuesta

30

Sí, argparse con add_subparser().

Todo está bien explicado en la sección Sub-commands.

Transferencia de uno de los ejemplos de allí:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers() 
>>> checkout = subparsers.add_parser('checkout', aliases=['co']) 
>>> checkout.add_argument('foo') 
>>> parser.parse_args(['checkout', 'bar']) 
Namespace(foo='bar') 

Editar: Desafortunadamente no hay auto generada comando especial help, pero se puede obtener el mensaje de ayuda detallado (que parece que quieres) con -h o --help uno como normalmente después del comando:

$ ./MyApp.py branch --help 

Por verbosa no quiero decir que es como una página de manual, es como todos los demás --help tipo de ayuda: el listado de todos los argumentos, etc ...

Ejemplo:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers(description='Sub description') 
>>> checkout = subparsers.add_parser('checkout', description='Checkout description') 
>>> checkout.add_argument('foo', help='This is the foo help') 
>>> parser.parse_args(['checkout', '--help']) 
usage: checkout [-h] foo 

Checkout description 

positional arguments: 
    foo   This is the foo help 

optional arguments: 
    -h, --help show this help message and exit 

Si es necesario, debe ser fácil de implementar un comando help que redirige a --help.

+0

Puede valer la pena señalar que la palabra clave 'aliases' para' subparsers.add_parser() 'es nueva en Python 3 y no está disponible en Python 2.7. – Juan

+0

Cuidado con argparse: una vez que comienzas a agregar subparsers anidados las cosas se ponen muy desordenadas. Ver por ejemplo: http://bugs.python.org/issue9253 – Federico

+0

El gran paquete [clic] (http://click.pocoo.org/) ofrece esta funcionalidad lista para usar. Consulte el tutorial * complex * [aquí] (http://click.pocoo.org/5/complex/) –

4

un corte razonable para obtener el comportamiento gema/estilo git "ayuda" (que acabo de escribir esto por lo que estoy trabajando de todos modos):

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(dest='sub_commands') 
parser_branch = subparsers.add_parser('branch', description='list of branches') 
parser_help = subparsers.add_parser('help') 
parser_help.add_argument('command', nargs="?", default=None) 

# I can't find a legitimate way to set a default subparser in the docs 
# If you know of one, please let me know! 
if len(sys.argv) < 2: 
    sys.argv.append('--help') 

parsed = parser.parse_args() 

if parsed.sub_commands == "help": 
    if not parsed.command: 
     parser.parse_args(['--help']) 
    else: 
     parser.parse_args([parsed.command, '--help']) 

argparse es definitivamente un paso adelante respecto a optparse y otra soluciones de Python que he encontrado. Pero IMO, el estilo gema/git de manejar args, es solo una forma más lógica y segura de hacer las cosas, por lo que es molesto que no sea compatible.

Cuestiones relacionadas