2010-10-15 69 views
0

我一直在网上寻找解决方案来解决我的Python问题。我正尝试使用urllib2连接从HTTP服务器读取可能层出不穷的数据流。它是一些交互式通信的一部分,所以重要的是我可以获取可用的数据,即使它不是一个完整的缓冲区。似乎没有办法让read \ readline返回可用的数据。它会在返回之前永远阻止整个(无尽的)流等待。便秘的Python urllib2插座

即使我使用fnctl将底层文件描述符设置为非阻塞,urllib2文件对象仍然会阻止!一般来说,似乎没有办法让python文件对象在read上返回所有可用数据(如果有的话),否则返回阻塞。

我见过一些关于寻求帮助的人的帖子,但我没有看到任何解决方案。是什么赋予了?我错过了什么吗?这看起来像这样一个正常的用例,完全毁了!我希望利用urllib2的能力来检测配置的代理和使用分块编码,但我不能,如果它不会合作。

编辑:根据要求,这里是一些示例代码

客户:

connection = urllib2.urlopen(commandpath) 
id = connection.readline() 

现在假设服务器使用块传输编码,并写入一个块往下流和块包含行,然后等待。连接仍然打开,但客户端在缓冲区中有数据等待。

我不能得到readreadline返回我知道它已经等待的数据,因为它试图读直到连接结束。在这种情况下,连接可能永远不会关闭,因此它将永远等待或直到发生非活动超时,切断连接。一旦连接断开,它将返回,但这显然不是我想要的行为。

+0

我不确定我是否正确理解您要实现的目标。你什么意思是阻止?你的意思是你希望你的脚本能够在流不再提供更多数据或其他东西时继续执行吗? – jsalonen 2010-10-15 09:40:25

+0

请提供一些示例代码;我们至少需要提出任何建议。 – tzot 2010-10-15 14:43:00

回答

1

urllib2在HTTP级别上运行,它与完整的文档一起工作。我不认为有没有办法绕过urllib2源代码。

你可以做的是使用普通套接字(在这种情况下你必须自己谈谈HTTP),并且调用sock.recv(maxbytes),它只读取可用数据。

更新:你可能想尝试调用conn.fp._sock.recv(maxbytes),而不是conn.read(bytes)urllib2连接。

+0

使用urllib2连接的要点是,urllib2已经支持环境代理和分块编码,我并不太兴奋实现自己。我觉得如果我能在最下方的裤子上踢点什么,一切都会奏效...... – jdizzle 2010-10-15 18:26:22

+0

对,我不希望自己开始实施所有这些。 'conn.fp._sock.recv(maxbytes)'技巧对你有什么好处吗? – Wim 2010-10-18 15:37:10

+0

我实际上最终使用了conn.fp._sock.fp._sock或者其他类似的东西。我不得不实现一个分块的解码器,但这并不是那么困难。这不必处理代理问题,真让我害怕。 – jdizzle 2010-10-19 18:40:29