似乎我无法urllib2
考虑超时。我确实阅读了 - 我想 - 所有与该主题相关的帖子,看来我没有做错任何事情。我对么?非常感谢您的帮助。
设想:
在继续执行剩余的脚本之前,我需要检查 Internet 连接。然后我编写了一个函数 (Net_Access),如下所示。
- 当我在连接 LAN 或 Wifi 接口并检查现有主机名的情况下执行此代码时:一切都很好,因为没有错误或问题,因此没有超时。
- 如果我拔下 LAN 连接器或检查不存在的主机名,超时值似乎被忽略。请问我的代码有什么问题?
一些信息:
- Ubuntu 10.04.4 LTS(运行到 VirtualBox v4.2.6 VM,主机操作系统是 MAC OS X Lion)
cat /proc/sys/kernel/osrelease: 2.6.32-42-generic
- Python 2.6.5
我的代码:
#!/usr/bin/env python
import socket
import urllib2
myhost = 'http://www.google.com'
timeout = 3
socket.setdefaulttimeout(timeout)
req = urllib2.Request(myhost)
try:
handle = urllib2.urlopen(req, timeout = timeout)
except urllib2.URLError as e:
socket.setdefaulttimeout(None)
print ('[--- Net_Access() --- No network access')
else:
print ('[--- Net_Access() --- Internet Access OK')
1) 工作,插入 LAN 连接器
$ $ time ./Net_Access
[--- Net_Access() --- Internet Access OK
real 0m0.223s
user 0m0.060s
sys 0m0.032s
2) 超时不起作用,拔掉 LAN 连接器
$ time ./Net_Access
[--- Net_Access() --- No network access
real 1m20.235s
user 0m0.048s
sys 0m0.060s
添加到原始帖子:测试结果(使用 IP 而不是 FQDN)
正如@unutbu(见评论)所建议的那样,用 IP 地址替换 myhost 中的 FQDN 可以解决问题:超时生效。
LAN 连接器插入...
$ time ./Net_Access [--- Net_Access() --- Internet Access OK
real 0m0.289s
user 0m0.036s
sys 0m0.040s
LAN 连接器已拔出...
$ time ./Net_Access [--- Net_Access() --- 无网络访问
real 0m3.082s
user 0m0.052s
sys 0m0.024s
这很好,但这意味着超时只能用于 IP 而不能用于 FQDN。诡异的...
是否有人找到了使用 urllib2 超时而不进入预 DNS 解析并将 IP 传递给函数的方法,或者您是否首先使用套接字测试连接,然后在确定可以到达目标时触发 urllib2?
非常感谢。