витой stdio.StandardIO на Windows - PullRequest
2 голосов
/ 15 марта 2012

У меня Python 2.7 amd64 работает на Windows 7 + последняя Twisted 12 У меня очень простая программа, которая соединяет STDIN / STDOUT с удаленным сервером TCP

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\n" % line)

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

class CFactory(protocol.ClientFactory):
        protocol = Client


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

if __name__ == '__main__':
    main()

В Linux все работает просто отлично. Но в Windows мой ввод в stdin игнорируется. Так что ничего не отправляется на удаленную сторону

Есть идеи почему?

Ответы [ 3 ]

1 голос
/ 13 июля 2012

Попробуйте данные получены, они могут работать.: 1001

class Echo(basic.LineReceiver):
...
    def dataReceived(self, data):
        self.connector.transport.write("%s\n" % data)
...
1 голос
/ 15 января 2013

В Windows необходим патч для решения проблемы получения ввода от ввода-вывода Std. Обратитесь к решению, опубликованному в билете № 2157 на сайте twistedmatrix.com здесь: http://twistedmatrix.com/trac/ticket/2157

Решение имеет несколько вложений - для отдельных патчей. И есть консолидированный файл патча, который является унифицированным diff.

У меня есть 64-битный Python 2.7.3. работающий на 64-битной машине Windows 7 с Twisted 12.3.0, и я применил вышеуказанный унифицированный патч к _win32stdio.py, _pollingfile.py, conio.py. Это позволяет вводить и выводить в / из стандартного ввода-вывода для реализаций IProtocol.

1 голос
/ 16 марта 2012
class Client(basic.LineReceiver):
    def lineReceived(self, line):
        delimiter = '\n'
        print "%s" % line

Строка delimiter = '\n' здесь не имеет полезных последствий.Он определяет новое имя в локальной области действия функции lineReceived, а затем игнорирует это локальное имя.

Я думаю, что вы намеревались сделать:

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

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

Этоопределяет новый атрибут Client класса delimiter, который управляет тем, как базовый класс basic.LineReceiver разделяет строки.

Однако ваша программа-пример определяет только Client, она не 'на самом деле использовать его.Так что это не причина проблемы.Однако причина проблемы очень похожа.Echo используется для обработки стандартного ввода и вообще не перекрывает стандартный разделитель LineReceiver.По умолчанию используется значение '\r\n', которое не является разделителем строк, используемым при стандартном вводе Windows.

Запустите определение Echo следующим образом:

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

, и я думаю, что программа будетведите себя так, как вам хочется, поскольку Windows использует «\ n» для разделения строк на стандартном вводе (хотя нет компьютера с Windows, чтобы это проверить, поэтому вам может потребоваться проверить дважды; если это , а не , случай,Очень полезным ответом было бы объяснить, что такое разделитель ; если это так, то проверка этой информации также будет хорошей вещью).

...