Интеграция Python Twisted с модулем Cmd

Мне нравятся Twisted и Cmd из Python. Я хочу использовать их вместе.

У меня кое-что работает, но пока я не понял, как заставить работать завершение табуляции, потому что я не понимаю, как получать события нажатия клавиш табуляции сразу (без нажатия Enter) в LineReceiver от Twisted.

Вот мой код на данный момент:

#!/usr/bin/env python

from cmd import Cmd
from twisted.internet import reactor
from twisted.internet.stdio import StandardIO
from twisted.protocols.basic import LineReceiver

class CommandProcessor(Cmd):
    def do_EOF(self, line):
        return True

class LineProcessor(LineReceiver):
    from os import linesep as delimiter # makes newline work

    def __init__(self):
        self.processor = CommandProcessor()
        self.setRawMode()

    def connectionMade(self):
        self.transport.write('>>> ')

    def rawDataReceived(self, data):
        self.processor.onecmd(data)
        self.transport.write('>>> ')

StandardIO(LineProcessor())
reactor.run()

Кроме завершения табуляции, это в некоторой степени работает. Я могу ввести команду типа "help", и модуль Cmd выведет результаты. Но я потерял замечательную функциональность модуля Cmd по заполнению вкладок, потому что Twisted буферизирует по одной строке за раз. Я пробовал установить LineProcessor.delimiter в пустую строку, но безрезультатно. Может быть, мне нужно найти какую-то другую часть Twisted, чтобы использовать ее вместо LineReceiver? Или, может быть, есть более простой подход, который позволит мне избежать необходимости обрабатывать каждый символ по одному?

Я не могу использовать только Cmd, потому что хочу сделать это сетевым приложением, где некоторые команды будут приводить к отправке данных, а получение данных из сети будет происходить асинхронно (и отображаться пользователю).

Итак, независимо от того, начнем ли мы с приведенного выше кода или с чего-то совершенно другого, я хотел бы создать хорошее, дружественное терминальное приложение на Python, реагирующее на сетевые события, а также на завершение табуляции. Надеюсь, я смогу использовать то, что уже есть, и мне не придется слишком много реализовывать самому.

6
задан John Zwinck 19 December 2011 в 22:11
поделиться