4

Twisted を使用して Python 2.7 でクライアントを作成しようとしています。私のコードは Linux (debian スクイーズ) では問題なく動作しますが、Windows (XP および 7) で試してみると、絶え間なくエラー メッセージが表示されます。これらのメッセージのスクリーンショットはこちらです。

私はバグを絞り込み、まだバグを含んでいるクライアントの非常に簡素化されたバージョンを書くことができました:

from twisted.internet.protocol import Protocol,ClientFactory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor

class TheClient(LineReceiver):
    def lineReceived(self,line):
        print line

    def connectionLost(self,reason):
        reactor.stop()

class TheFactory(ClientFactory):
    protocol = TheClient

class Test(object):
    def doRead(self):
        pass

    def fileno(self):
        return 0

    def connectionLost(self,reason):
        print 'connection lost'

    def logPrefix(self):
        return 'Client'

def main():
    print 'starting'
    test = Test()
    reactor.addReader(test)
    reactor.run()

if __name__ == '__main__':
    main()

「reactor.addReader(test)」を含む行がコメント アウトされている場合、エラー メッセージは表示されません。行をコメントアウトせずに Linux でこのコードを実行すると、エラー メッセージは表示されません。

私はこの質問を見つけました。同じ問題ではないと思いますが、予想通り、Windowsでは正しく機能しませんでした。

このコードは正しいですか、これは Windows のバグですか、それとも Windows で動作させるには別のことをしなければなりませんか?

4

1 に答える 1

2

の Windows 実装はselect、ソケットのみをサポートします。おそらく、プロセス内のファイル記述子 0 はソケットを表していません。標準 I/O に関連する何かを表している可能性が高いです。

標準の I/O を使用したいだけなら がtwisted.internet.stdioありますが、Windows では多少の荒削りに遭遇する可能性があります (バグの報告と修正を歓迎します!)。

標準 I/O に興味がなく、0 が単なる任意のテストである場合は、具体的にどのような入力を行おうとしているのかを決定する必要があるでしょう。持っているファイル記述子の種類に応じて、それから正常に読み取るための異なるアプローチがおそらくあるでしょう。

于 2012-07-31T10:52:54.703 に答える