我有Python 2.7 amd64运行在Windows 7 +最新扭曲12我有非常简单的程序连接标准input/标准输出与远程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上,我的stdininput被忽略。 所以没有什么被发送到远程端
任何想法为什么?
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机器来验证,所以你可能要仔细检查;如果情况并非如此,非常有用的回应是解释分隔符是什么;如果是这样的话,验证信息也是一件好事)。
尝试dataReceived,它可能工作:
class Echo(basic.LineReceiver): ... def dataReceived(self, data): self.connector.transport.write("%s\n" % data) ...
在Windows上,需要修补程序来修复从标准I / O接收输入的问题。 请参阅twistedmatrix.com网站上的解决方案:#twistedmatrix.com/trac/ticket/2157
该解决方案有几个附件 – 个别补丁。 还有一个统一的补丁文件是一个统一的差异。
我有一个64位的Python 2.7.3。 在Twisted 12.3.0的Windows 7 64位机器上运行,并将上述统一补丁应用于_win32stdio.py,_pollingfile.py,conio.py。 这允许输入和输出来自标准I / O的IP协议实现。