双绞线未收到呼叫
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'
我在 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'