Twisted lineReceived没有被调用

时间:2017-01-11 04:14:08

标签: python command-line twisted

当我在python中构建命令行界面时,我遇到了一个奇怪的行为。以下是可以重现问题的代码的条带化版本。

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

class CommandLine(basic.LineReceiver):
    def __init__(self):
        self.linebuf = ''
        self.setLineMode()

    # why lineReceived  doesn't work?
    # def lineReceived(self, data):
    def dataReceived(self, data):
        print 'data received ' + ' '.join([str(ord(c)) for c in data ])
        print data


if __name__=='__main__':
    stdio.StandardIO(CommandLine())
    reactor.run()

上述代码按预期工作,以"数据的形式输出108 115 115 10"每次输入一行时都会打印。以下是使用dataReceived的示例输出:

$ python cmdline.py
hello
data received 104 101 108 108 111 10
hello

^[[A
data received 27 91 65 10

但是,当我在上面的代码中使用lineReceived而不是dataReceived时,除了命令行本身的回显之外没有任何内容被打印出来。使用lineReceived的示例输出:

$ python cmdline.py
hello
^[[A

根据lineReceived上的文档,当LineReceiver以行模式接收到一行时,将调用lineReceived函数。

目前我正在使用dataReceived使其正常工作。但我想知道为什么lineReceived没有按预期工作。任何提示,建议,建议都将非常感谢!

问候。

1 个答案:

答案 0 :(得分:1)

原因是行delimiter常量被设置为r' \ r \ n'默认情况下(MS Windows分隔符)。尝试将其设置为' \ n' (Linux和Mac OS)改为:

class CommandLine(basic.LineReceiver):
    delimiter = '\n'