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 回答