2017-01-11 3 views
1

Ich stieß auf ein seltsames Verhalten, als ich eine Befehlszeilenschnittstelle in Python baute. Hier ist die abgespeckte Version des Codes, die das Problem reproduzieren kann.Twisted lineReceived wird nicht aufgerufen

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

Der obige Code wie vorgesehen funktioniert, die in Form von Put „Daten empfangen 108 115 115 10“ gedruckt wird, jedes Mal wenn eine Zeile eingegeben wird. Hier ist ein Beispiel für die Ausgabe DataReceived mit:

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

^[[A 
data received 27 91 65 10 

aber nichts wird außer dem Echo der Kommandozeile ausgedruckt selbst wenn ich lineReceived statt DataReceived in dem obigen Code verwenden. Beispiel Ausgabe mit lineReceived:

$ python cmdline.py 
hello 
^[[A 

auf lineReceived die die Dokumentation nach, wird die lineReceived Funktion aufgerufen, wenn eine Zeile mit dem LineReceiver im Zeilenmodus empfangen wird.

Momentan verwende ich dataReceived, damit es funktioniert. Aber ich möchte herausfinden, warum lineReceived nicht wie vorgesehen funktioniert. Jeder Hinweis, Vorschläge, Ratschläge würden sehr geschätzt werden!

Grüße.

Antwort

1

Der Grund ist die Zeile delimiter Konstante, die standardmäßig auf r '\ r \ n' gesetzt ist (MS Windows-Begrenzer). Versuchen Sie es auf '\ n' (Linux und Mac OS) statt:

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

Das ist genau, warum. Ich danke dir sehr! – flintlock

+0

Ein kleiner Fehler in Ihrem Code-Snippet gedacht ... es sollte "self.delimiter" sein. – flintlock

+0

@flintlock Ja, wenn Sie es in '__init__' Methode verwenden. Aber es ist eine Klassenstufe [Variable] (https://github.com/twisted/twisted/blob/twisted-16.5.0/src/twisted/protocols/basic.py#L528), besser, es auf die gleiche Weise zu definieren . –