Telnet клиент на питоне: как реализовать автодополнение команды в консоли по tab?

Привет всем,

Собственно на данный момент располагаю примером:

# telnet program example
import socket, select, string, sys
 
#main function
if __name__ == "__main__":
     
    if(len(sys.argv) < 3) :
        print 'Usage : python telnet.py hostname port'
        sys.exit()
     
    host = sys.argv[1]
    port = int(sys.argv[2])
     
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(2)
     
    # connect to remote host
    try :
        s.connect((host, port))
    except :
        print 'Unable to connect'
        sys.exit()
     
    print 'Connected to remote host'
     
    while 1:
        socket_list = [sys.stdin, s]
         
        # Get the list sockets which are readable
        read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])
         
        for sock in read_sockets:
            #incoming message from remote server
            if sock == s:
                data = sock.recv(4096)
                if not data :
                    print 'Connection closed'
                    sys.exit()
                else :
                    #print data
                    sys.stdout.write(data)
             
            #user entered a message
            else :
                msg = sys.stdin.readline()
                s.send(msg)


Пример работает, НО пользоваться таким клиентом не удобно, не хватает автодополнения по нажатию tab. (bash completion, насколько я понимаю)

Пробовал вместо sys.stdin.readline() посылать sys.stdin.read(1), не помогло.

Как сделать так, чтобы при нажатии tab строчка бы или автоматически заполнялась или выводились бы возможные варианты?
  • Вопрос задан
  • 2263 просмотра
Решения вопроса 1
un1t
@un1t
Если я правильно понял, что вам нужно

import readline

texts = ['hello', 'world', 'readline']

def completer(text, state):
    options = [x for x in texts 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы