2011-12-05 11 views
48

Me gustaría obtener autocompletado en mis scripts de python también en los argumentos.Python argparse y finalización de bash

que nunca había entendido realmente cómo el bash_completion trabajó (por argumentos), pero después de que cavaron en entendí que:

  1. se utiliza "completa" para unir una función de completar a un comando
  2. cada la función de completar es básicamente una copia del argumento analizador

El segundo punto en particular no es muy bueno, porque me gustaría que se genere automáticamente.

Lo mejor es que el shell pregunta a mi programa en cada TAB qué hay que completar, pero tengo la impresión de que esto no puede funcionar realmente, ¿es correcto?

La segunda opción probablemente sea simplemente escribir un convertidor desde un analizador argparse a una función de shell que se completa correctamente.

+5

¿Has visto este hilo http://bugs.python.org/issue4256? También parece que 'optparse' tiene soporte automático para completar shell: http: //pypi.python.org/pypi/optcomplete – Chris

Respuesta

13

Bash "completion" realmente es genial. Y fácil para programas escritos en Python ....

Creo que esto es justo lo que quiere: optcomplete: Shell Completion Self-Generator for Python. Está disponible, por ejemplo, como el paquete "python-optcomplete" en Ubuntu.

inserta un par de líneas en su programa de pitón, y el usuario (una vez) corre el programa bash "completa" para contar fiesta de cómo llevar a cabo los argumentos:

complete -F _optcomplete <program> 

y ahora el usuario tiene la terminación ! Por defecto, proporciona una finalización simple de las opciones del programa. Vea el ejemplo de cómo personalizar cómo funciona la finalización para una opción en particular. Está bellamente escrito y es fácil de extender para manejar subcomandos, opciones de finalización alternativas, etc.

Actualización:

para la terminación en zsh (tanto para optparse y argparse) ver genzshcomp 0.3.1 : Python Package Index

Como señaló @englebip, todavía necesitamos algo similar para el nuevo módulo argparse, introducido en Python 2.7 y 3.2, ya que optparse ahora está en desuso.

Aquí está la discusión sobre moverse en esa dirección:

Véase también este telón de fondo sobre cómo se hace: How does argparse (and the deprecated optparse) respond to 'tab' keypress after python program name, in bash? - Stack Overflow

+2

Esto es de hecho muy bueno, pero funciona para el ahora obsoleto módulo 'optparse' y no para el actual' argparse'. ¿Alguna idea de una reimplementación con 'argparse'? – englebip

+0

@englebip Bueno, es difícil describir 'optparse' como obsoleto ya que su reemplazo, argparse, se introdujo por primera vez en Python 2.7 y Python 3.2. El término oficial es "Deprecated", que puede durar mucho tiempo. Pero me gustaría ver algo como optcomplete para argparse, y hay esfuerzos para que eso suceda. – nealmcb

58

desvergonzada autopromoción : https://github.com/kislyuk/argcomplete

argcomplete proporciona terminación de bash para argparse.

+2

Lo recomiendo también. –

+0

También _exactly_ what @ andrea-crotti está buscando – Thomas

+0

@weaver De los documentos, parece que se debe habilitar la finalización global o se debe agregar una declaración de evaluación específica a bashrc. ¿Hay alguna manera de crear un script de finalización y dejar que bash sepa dónde está el script? – balki

Cuestiones relacionadas