当我在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没有按预期工作。任何提示,建议,建议都将非常感谢!
问候。
答案 0 :(得分:1)
原因是行delimiter常量被设置为r' \ r \ n'默认情况下(MS Windows分隔符)。尝试将其设置为' \ n' (Linux和Mac OS)改为:
class CommandLine(basic.LineReceiver):
delimiter = '\n'