Мне нравятся 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, реагирующее на сетевые события, а также на завершение табуляции. Надеюсь, я смогу использовать то, что уже есть, и мне не придется слишком много реализовывать самому.