2011-12-05 29 views
48

Mi piacerebbe ottenere il completamento automatico sui miei script python anche negli argomenti.Completamento Python argparse e bash

avevo mai veramente capito come il bash_completion lavorato (per argomenti), ma dopo che ho scavato in ho capito che:

  1. utilizza "completo" per associare una funzione completando a un comando
  2. ogni la funzione di completamento è fondamentalmente una copia dell'argomento parser

Il secondo punto in particolare non è eccezionale, perché mi piacerebbe averlo generato automaticamente.

La cosa migliore sarebbe che la shell chiede al mio programma su ogni TAB su cosa completare, ma ho l'impressione che questo non possa funzionare davvero, è corretto?

La seconda opzione è probabilmente solo per scrivere un convertitore da un parser argparse a una funzione shell che completa correttamente.

+5

Hai visto questa discussione http://bugs.python.org/issue4256? Sembra anche che 'optparse' abbia il supporto per il completamento automatico della shell: http: //pypi.python.org/pypi/optcomplete – Chris

risposta

13

Bash "completion" è davvero fantastico. E facile per i programmi scritti in Python ....

Penso che questo sia proprio quello che vuoi: optcomplete: Shell Completion Self-Generator for Python. È disponibile, ad esempio, come pacchetto "python-optcomplete" in Ubuntu.

si inserisce un paio di linee nel vostro programma di pitone, e l'utente (una volta) gestisce il bash programma "completo" per dire a bash come completare gli argomenti:

complete -F _optcomplete <program> 

e ora l'utente ha completato ! Di default dà un semplice completamento sulle opzioni del programma. Vedere l'esempio su come personalizzare il modo in cui il completamento funziona per una particolare opzione. È ben scritto e facile da estendere per gestire i sottocomandi, le opzioni di completamento alternative, ecc.!

Aggiornamento:

per il completamento nel zsh (sia per optparse e argparse) vedi genzshcomp 0.3.1 : Python Package Index

Come notato da @englebip, abbiamo ancora bisogno di qualcosa di simile per il nuovo modulo argparse, introdotto in Python 2.7 e 3.2, dal momento che optparse è ora deprecato.

Ecco la discussione sulla muoversi in quella direzione:

Vedi anche questo fondo su come è fatto: How does argparse (and the deprecated optparse) respond to 'tab' keypress after python program name, in bash? - Stack Overflow

+2

Questo è davvero molto interessante, ma funziona per il modulo 'optparse' ora obsoleto e non per l'attuale' argparse'. Qualche idea di una nuova implementazione con 'argparse'? – englebip

+0

@englebip Beh, è ​​difficile descrivere 'optparse' come obsoleto dal momento che la sua sostituzione, argparse, è stata introdotta per la prima volta in Python 2.7 e Python 3.2. Il termine ufficiale è "Deprecated", che può durare a lungo. Ma mi piacerebbe davvero vedere qualcosa come opt-complete per argparse, e ci sono sforzi per farlo accadere. – nealmcb

58

Shameless auto-promozione : https://github.com/kislyuk/argcomplete

argcomplete fornisce il completamento di bash per argparse.

+2

Lo consiglio anche io. –

+0

Anche _exactly_ cosa @ andrea-crotti sta cercando – Thomas

+0

@weaver Dai documenti, sembra che il completamento globale debba essere abilitato o che sia necessario aggiungere un'istruzione specifica a bashrc. C'è un modo per creare uno script di completamento e lasciare che bash sappia dove si trova lo script? – balki

Problemi correlati