python - snoet stdio.StandardIO på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har Python 2,7 amd64, der kører på Windows 7 + senest Twisted 12
Jeg har meget simpelt program, der forbinder stdin/stdout med fjerntliggende tcp server


from twisted.internet import stdio, reactor, protocol
from twisted.protocols import basic

class Echo(basic.LineReceiver):
    def connectionMade(self):
        self.factory = CFactory()
        self.connector = reactor.connectTCP('remote', 8585, self.factory)

    def lineReceived(self, line):
        self.connector.transport.write("\%s
" \% line)

class Client(basic.LineReceiver):
        def lineReceived(self, line):
                delimiter = '
'
                print "\%s" \% line

class CFactory(protocol.ClientFactory):
        protocol = Client


def main():
    stdio.StandardIO(Echo())
    reactor.run()

if \_\_name\_\_ == '\_\_main\_\_':
    main()


På Linux virker det fint. Men på Windows bliver min input til stdin ignoreret. Så intet bliver sendt til fjernsiden


Enhver ide hvorfor?

Bedste reference


class Client(basic.LineReceiver):
    def lineReceived(self, line):
        delimiter = '
'
        print "\%s" \% line


Linjen delimiter = ' ' her har ingen nyttige konsekvenser. Det definerer et nyt navn i den lokale rækkevidde af funktionen lineReceived og ignorerer derefter det lokale navn.


Hvad du ville gøre, tror jeg, er:


class Client(basic.LineReceiver):
    delimiter = '
'

    def lineReceived(self, line):
        print "\%s" \% line


Dette definerer en ny egenskab af klassen Client, delimiter, som styrer hvordan basklassen basic.LineReceiver opdeler linjer.


Men dit eksempelprogram definerer kun Client, det bruger ikke det faktisk. Så det er ikke årsagen til problemet. Årsagen til problemet er dog meget ens. Echo bruges til at håndtere standardindgang, og det overstyrer slet ikke standard LineReceiver afgrænsningen. Standardværdien er ' ', som ikke er linjebegrænseren, der anvendes til Windows standardindgang.


Start din Echo definition som denne:


class Echo(basic.LineReceiver):
    delimiter = '
'


og jeg tror, ​​at programmet vil opføre sig som du vil, da Windows bruger '\ n' til at afgrænse linjer på standardindgang (ingen Windows-maskine rundt for at bekræfte det, selvom du måske vil dobbelttjekke, hvis det er ikke sagen, et meget nyttigt svar på at gøre ville være at forklare, hvad afgrænseren er ; hvis det er tilfældet, vil verificeringen af ​​disse oplysninger også være en god ting).

Andre referencer 1


Prøv data Modtaget, det kan virke .:


class Echo(basic.LineReceiver):
...
    def dataReceived(self, data):
        self.connector.transport.write("\%s
" \% data)
...

Andre referencer 2


På Windows kræves en patch for at løse problemet med at modtage input fra Std I/O.
Se løsningen på billet nr. 2157 på twistedmatrix.com her: http://twistedmatrix.com/trac/ticket/2157[16]


Løsningen har flere vedhæftede filer - til individuelle pletter. Og der er en konsolideret patch-fil, som er en samlet diff.


Jeg har en 64-bit Python 2.7.3. kører på en Windows 7 64-bit maskine med Twisted 12.3.0 og jeg anførte ovenstående ensartede patch til \_win32stdio.py, \_pollingfile.py, conio.py. Dette tillader input og output til/fra Std I/O til IProtocol implementeringer.