使用basic.LineReceiver接受单个字符

时间:2014-08-27 18:29:47

标签: python-2.7 twisted

我正在使用twisted basic.LineReceiver在程序运行时从终端接收命令。这个实用程序在大多数情况下都能很好地工作,因为它与其他扭曲的工作完美无瑕。但是,有时我需要更高级的功能,例如从终端输入字符时接收字符。作为一个例子,添加一个方法来查找在显示器上输出为^[[A的UP字符(或者更确切地说在缓冲区中看作0x1B5B61)真的很棒。添加接受这些特殊字符的功能对于接受非常有用。是否有一个预先存在的模块由twisted提供以执行此功能?

下面的代码是在我们输入twisted's documentation to handle received data中显示的dataReceived方法之前拦截字符的测试。测试scenerio旨在提供提示(-->是我通过修改self.prompt选择的可编辑提示。在控制台中输入任何内容都应该触发对象写出等同于刚输入的十六进制的十六进制。我发现dataReceived仅在我的测试场景中被调用,当用户按下Return键时(并且在键入单个字符时不调用)。这通过注入尝试呈现无用,因为我需要拦截消息而不需要用户键入enter。

from os import linesep
from twisted.protocols import basic
from twisted.internet import reactor, stdio

class Test(basic.LineReceiver):
    delimiter = linesep

    def __init__(self):
        self.vk_up = '\x1B\x5B\x61'
        self.vk_down = '\x1B\x5B\x62'
        self.vk_left = '\x1B\x5B\x64'
        self.vk_right = '\x1B\x5B\x63'
        self.prompt = '-->'

    def connectionMade(self):
        self.transport.write(self.prompt)

    def dataReceived(self, data):
        # This print statement below is my attempt to read what is passed into
        # this method.
        self.sendLine(self.hexify(data))
        basic.LineReceiver.dataReceived(self, data)

    def lineReceived(self, line):
        self.run_cmd(line)

    def run_cmd(self, cmd):
        self.transport.write('{}{}{}'.format(cmd, Test.delimiter, self.prompt))

    def hexify(self, data, sep=' '):
        return sep.join(['{:02X}'.format(ord(x)) for x in data])

def main():
    stdio.StandardIO(Test())
    reactor.run()

if __name__ == '__main__':
    main()

我希望有一个twisted.protocols.advanced.LineReceiver,但可能性很小。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

twisted.conch.insults并且invective中有一些更好的代码,它们有一些更好的输入处理代码,您可以以某种方式重复使用。