Twisted lineReceived not getting called

。_饼干妹妹 提交于 2021-02-11 10:22:46

问题


I encountered a strange behavior when i was building a command line interface in python. Here is the striped down version of the code that can reproduce the issue.

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

The code above works as intended, out put in the form of "data received 108 115 115 10" is printed everytime a line is entered. Here is a sample output using dataReceived:

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

^[[A
data received 27 91 65 10

However nothing gets printed out except the echo of the command line itself when I use lineReceived instead of dataReceived in the code above. Example output using lineReceived:

$ python cmdline.py
hello
^[[A

According the the documentation on lineReceived, the lineReceived function gets invoked when a line is received with the LineReceiver in line mode.

For now I am using dataReceived to make it work. But I would like to find out why lineReceived is not working as intended. Any hint, suggestions, advice would be very much appreciated!

Regards.


回答1:


The reason is line delimiter constant which is set to r'\r\n' by default (MS Windows delimiter). Try to set it to '\n' (Linux and Mac OS) instead:

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


来源:https://stackoverflow.com/questions/41582595/twisted-linereceived-not-getting-called

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!