Python urllib2.urlopen将永远挂起,尽管超时

Python urllib2.urlopen将永远挂起,尽管超时,python,http,timeout,settimeout,urllib2,Python,Http,Timeout,Settimeout,Urllib2,希望这是一个很简单的问题,但它让我发疯。 我正在ubuntu 12.10服务器的开箱即用安装上使用Python 2.7.3。我一直在关注这个问题,直到找到这个片段: import urllib2 x=urllib2.urlopen("http://casacinema.eu/movie-film-Matrix+trilogy+123+streaming-6165.html", timeout=5) 它只是永远挂起,从不超时。 我显然做错了什么。有人能帮忙吗? 非常感谢 Matteo看起来您遇到

希望这是一个很简单的问题,但它让我发疯。 我正在ubuntu 12.10服务器的开箱即用安装上使用Python 2.7.3。我一直在关注这个问题,直到找到这个片段:

import urllib2
x=urllib2.urlopen("http://casacinema.eu/movie-film-Matrix+trilogy+123+streaming-6165.html", timeout=5)
它只是永远挂起,从不超时。 我显然做错了什么。有人能帮忙吗? 非常感谢


Matteo看起来您遇到了代理问题。以下是关于如何解决此问题的一个很好的解释:

我已经用python 2.7.3在我的ubuntu上执行了你的代码,没有看到任何错误

也可考虑使用:

另见:


最初的海报上说,他们不明白为什么它会挂起,但他们也想找到一种方法来防止
urlib.request.urlopen
挂起。我不能说如何防止它被悬挂,但如果它能帮助某人,这就是为什么它可以被悬挂

pythonurllib/3.6
客户端很挑剔。例如,它期望服务器返回
HTTP/1.1200ok
而不是
http200ok
。它还希望服务器在发送头中的
connection:close
时关闭连接


诊断此问题的最佳方法是获取服务器响应的原始输出,并将其与您知道有效的另一个服务器响应进行比较。然后,如果您必须创建一个服务器并操纵响应,则可以准确地确定差异的原因。也许,这至少会导致服务器上的更改并允许它不挂起。

可以按照建议尝试使用socket.setdefaulttimeout(5)

插座和层 Python对从web获取资源的支持是分层的。urllib2使用httplib库,而httplib库又使用套接字库

从Python2.3开始,您可以指定套接字在超时之前等待响应的时间。这在必须获取网页的应用程序中非常有用。默认情况下,套接字模块没有超时,可以挂起。目前,在httplib或urllib2级别上未公开套接字超时。但是,可以使用全局设置所有套接字的默认超时

import socket
import urllib2

# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)

好。。我没有在我的服务器上配置任何代理。。。我不知道该怎么办。。如何检测是否存在应配置的代理?请注意,我在一个具有公共ip地址的web服务器上,这是从外部正确检测到的。它还可以毫不费力地加载其他网页。只有一些页面不会永远加载和挂起..谢谢。嗯,首先看看smth是否在
HTTP\u PROXY
env变量()中。您是否使用
请求
尝试过代码?是的,我使用请求尝试过您的代码,它与另一个代码完全一样挂起。HTTP_PROXY env变量在我的系统上为空。。。!奇怪,不是吗?我也有同样的问题。很明显,这是urllib2中的一个bug。我很少在Python2.6.XIn中看到这一点。我的情况是防火墙问题。我的本地防火墙LuLu阻止了所有python请求。删除该规则解决了这个问题。
import socket
import urllib2

# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)