双绞线未收到呼叫

Twisted lineReceived not getting called

我在 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()

上面的代码按预期工作,每次输入一行时都会打印 "data received 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 没有按预期工作。任何提示、建议、忠告将不胜感激!

此致。

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

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