tutorial programar interprete ejecutar desde consola compilar python linux unix command-line autocomplete

programar - Cómo hacer un python, programa de línea de comandos autocompletar cosas arbitrarias NO intérprete



python download (6)

Aquí hay una versión completa del código que fue muy útil por ephemient here (gracias).

import readline addrs = [''[email protected]'', ''[email protected]'', ''[email protected]''] def completer(text, state): options = [x for x in addrs if x.startswith(text)] try: return options[state] except IndexError: return None readline.set_completer(completer) readline.parse_and_bind("tab: complete") while 1: a = raw_input("> ") print "You entered", a

Soy consciente de cómo configurar el autocompletado de objetos de Python en el intérprete de Python (en Unix).

  • Google muestra muchos resultados para obtener explicaciones sobre cómo hacer esto.
  • Desafortunadamente, hay tantas referencias que es difícil encontrar lo que tengo que hacer, lo cual es ligeramente diferente.

Necesito saber cómo habilitar, tabulación / finalización automática de elementos arbitrarios en un programa de línea de comandos escrito en python.

Mi caso de uso específico es un programa de línea de comando python que necesita enviar correos electrónicos. Quiero poder autocompletar las direcciones de correo electrónico (tengo las direcciones en el disco) cuando el usuario escribe una parte (y opcionalmente presiona la tecla TAB).

No lo necesito para trabajar en Windows o Mac, solo en Linux.


Dado que dices "NO intérprete" en tu pregunta, supongo que no quieres respuestas que impliquen la lectura de Python y cosas por el estilo. ( Editar : en retrospectiva, obviamente ese no es el caso. Ho hum. Creo que esta información es interesante de todos modos, así que la dejo aquí).

Creo que puedes estar después de this .

Se trata de agregar la finalización del nivel de shell a comandos arbitrarios, extendiendo la finalización de pestañas de bash.

En pocas palabras, creará un archivo que contenga una función de shell que generará posibles terminaciones, guárdelo en /etc/bash_completion.d/ y regístrelo con el comando complete . Aquí hay un fragmento de la página vinculada:

_foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help --verbose --version" if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _foo foo

En este caso, el tipo de foo --[TAB] le dará los valores en la variable opts , es decir, --help , --verbose y --version . Para sus propósitos, esencialmente querrá personalizar los valores que se ponen en opts .

Mire el ejemplo en la página vinculada, todo es bastante sencillo.


Me sorprende que nadie haya mencionado argcomplete, aquí hay un ejemplo de los documentos:

from argcomplete.completers import ChoicesCompleter parser.add_argument("--protocol", choices=(''http'', ''https'', ''ssh'', ''rsync'', ''wss'')) parser.add_argument("--proto").completer=ChoicesCompleter((''http'', ''https'', ''ssh'', ''rsync'', ''wss''))


Sigue la documentación del cmd y estarás bien

import cmd addresses = [ ''[email protected]'', ''[email protected]'', ''[email protected]'', ] class MyCmd(cmd.Cmd): def do_send(self, line): pass def complete_send(self, text, line, start_index, end_index): if text: return [ address for address in addresses if address.startswith(text) ] else: return addresses if __name__ == ''__main__'': my_cmd = MyCmd() my_cmd.cmdloop()

Salida para pestaña -> pestaña -> enviar -> pestaña -> pestaña -> f -> pestaña

(Cmd) help send (Cmd) send [email protected] [email protected] [email protected] (Cmd) send [email protected] (Cmd)


Usa los enlaces readline de Python. Por ejemplo,

import readline def completer(text, state): options = [i for i in commands if i.startswith(text)] if state < len(options): return options[state] else: return None readline.parse_and_bind("tab: complete") readline.set_completer(completer)

Los documentos del módulo oficial no son mucho más detallados, consulte los documentos de lectura para obtener más información.


# ~/.pythonrc import rlcompleter, readline readline.parse_and_bind(''tab:complete'') # ~/.bashrc export PYTHONSTARTUP=~/.pythonrc