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


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.


76
2017-10-09 14:55


origen


Respuestas:


Usa Python readline enlaces 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)

El oficial documentos del módulo no son mucho más detallados, vea el leer documentos para más información.


49
2017-10-09 15:01



Siga el documentación de cmd y estarás bien

import cmd

addresses = [
    'here@blubb.com',
    'foo@bar.com',
    'whatever@wherever.org',
]

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
foo@bar.com            here@blubb.com         whatever@wherever.org
(Cmd) send foo@bar.com
(Cmd)

52
2017-10-09 15:08



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 todas formas, así que la dejo aquí.


27
2017-10-13 09:59



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

19
2018-05-30 16:59



Aquí hay una versión de trabajo completo del código que fue muy provisto por ephemient aquí (gracias).

import readline

addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']

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

11
2017-10-16 19:26



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

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc

7
2017-10-24 00:48