Cum de a face un piton, program de linie de comandă pentru completarea automată lucruri arbitrare NU interpret

voturi
75

Sunt conștient de modul în care să configurarea obiectelor Python autocompletării în interpret Python (pe unix).

  • Google afișează multe hit-uri pentru explicații cu privire la modul de a face acest lucru.
  • Din păcate, există atât de multe referiri la faptul că este dificil de a găsi ceea ce trebuie să fac, care este ușor diferit.

Trebuie să știu cum să activați, completarea filelor / auto de elemente arbitrare într-un program de linie de comandă scrisă în Python.

Cazul meu utilizare specifică este un program de Python linie de comandă, care are nevoie pentru a trimite email-uri. Vreau să fie în măsură Completarea automată adrese e-mail (am adresele de pe disc) atunci când utilizatorul introduce o parte din ea (și, opțional, apasă tasta TAB).

Nu am nevoie de ea pentru a lucra la Windows sau Mac, doar Linux.

Întrebat 09/10/2008 la 13:55
sursa de către utilizator
În alte limbi...                            


8 răspunsuri

voturi
49

Utilizați Python readlinelegături. De exemplu,

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)

Oficiale docs module nu sunt mult mai detaliate, consultați docs readline pentru mai multe informatii.

Publicat 09/10/2008 la 14:01
sursa de către utilizator

voturi
52

Urmați documentația cmd și vei fi bine

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

Ieșire pentru tab -> tab -> send -> tab -> tab -> f -> fila

(Cmd)
help  send
(Cmd) send
foo@bar.com            here@blubb.com         whatever@wherever.org
(Cmd) send foo@bar.com
(Cmd)
Publicat 09/10/2008 la 14:08
sursa de către utilizator

voturi
25

Din moment ce spui „NU interpret“ în întrebarea dumneavoastră, cred că nu vrei răspunsuri care implică readline Python și alte asemenea. ( Edita : în retrospectivă, nu este în mod evident cazul Ho hum cred că aceste informații este interesant , oricum, așa că o să - l las aici... )

Cred că s - ar putea fi după acest lucru .

Este vorba despre adăugarea de finalizare nivel de shell pentru comenzi arbitrare, se extinde propria filă-finalizare a bash-ului.

Într - un cuvânt, veți crea un fișier care conține un shell-funcție care va genera posibile completări, salvați - l în /etc/bash_completion.d/și înregistrați - l cu comanda complete. Iată un fragment din pagina conectată:

_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

În acest caz, tastarea foo --[TAB]vă va da valorile din variabila opts, adică --help, --verboseși --version. Pentru scopurile tale, veți dori , în esență , să personalizați valorile care sunt puse în opts.

Nu au o privire la exemplul de pe pagina de legat, totul e destul de simplu.

Publicat 13/10/2008 la 08:59
sursa de către utilizator

voturi
10

Aici este o versiune completă de lucru a codului care a fost foarte furnizat de ephemient aici (vă mulțumesc).

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
Publicat 16/10/2008 la 18:26
sursa de către utilizator

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

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc
Publicat 23/10/2013 la 23:48
sursa de către utilizator

voturi
19

Sunt surprins de faptul că nimeni nu a menționat argcomplete, aici este un exemplu de la docs:

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'))
Publicat 30/05/2014 la 15:59
sursa de către utilizator

voturi
0

Răspunsurile postate funcționează bine, dar am sursă deschisă o bibliotecă de completare automată pe care am scris la locul de muncă. Am folosit-o pentru o vreme în producție și este rapid, stabil și ușor de utilizat. Are chiar și un modul demo, astfel încât să puteți testa rapid ceea ce ar obține pe măsură ce tastați cuvinte.

Pentru a instala, pur și simplu rulați: pip install fast-autocomplete

Iată un exemplu:

>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3)  # mis-spelling
[['burrito']]

Checkout: https://github.com/wearefair/fast-autocomplete pentru codul sursă.

Și aici este o explicație a modului în care funcționează: http://zepworks.com/posts/you-autocomplete-me/

Se ocupa cu mis-grafii și opțional sortarea prin greutatea cuvântului. (să spunem că burritoeste mai important decât book, atunci va da burritoun „număr de “ mai mare și acesta va apărea înainte bookîn rezultate.

Cuvintele este un dicționar și fiecare cuvânt poate avea un context. De exemplu, „conta“, cum să afișeze cuvântul, un alt context, în jurul cuvântului, etc. În acest exemplu cuvinte nu au avut nici un context.

Publicat 29/03/2019 la 20:36
sursa de către utilizator

voturi
0

Puteți încerca să utilizați Toolkit Prompt Python , o bibliotecă pentru construirea de aplicații interactive de linie de comandă în Python.

Biblioteca face ușor pentru a adăuga funcționalitate de completare automată interactivă, permițând utilizatorului să folosească Tabcheia pentru ciclul vizual prin opțiunile disponibile. Biblioteca este cross-platform (Linux, OS X, FreeBSD, OpenBSD, Windows). Exemplu:

pgcli - Python Toolkit Prompt

(Sursa fotografiei: pcgli )

Publicat 29/05/2019 la 17:10
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more