urllib2.urlopen:在没有互联网连接的情况下启动脚本时,“名称或服务未知”仍然存在

时间:2014-01-25 21:58:49

标签: python urllib2

我在下面有一个简单的“工作”示例,每两秒打开一次谷歌连接。当我有一个有效的互联网连接时运行这个脚本,我得到了成功消息,然后当我断开连接时,我收到失败消息,当我再次重新连接时,我再次获得成功。到目前为止,非常好。

然而,当我在断开互联网时启动脚本时,我收到失败消息,当我稍后连接时,我从未收到成功消息。我一直收到错误:

  

urlopen错误[Errno -2]名称或服务未知

发生了什么事?

import urllib2, time

while True:
    try:
        print('Trying')
        response = urllib2.urlopen('http://www.google.com')
        print('Success')
        time.sleep(2)
    except Exception, e:
        print('Fail ' + str(e))
        time.sleep(2)

2 个答案:

答案 0 :(得分:16)

这是因为无法解析DNS名称“www.google.com”。如果没有Internet连接,则可能无法访问DNS服务器来解析此条目。

我似乎第一次误读了你的问题。在Linux上,您描述的行为是glibc的特性。加载时只读取一次“/etc/resolv.conf”。 glibc可以通过res_init()函数强制重新读取“/etc/resolv.conf”。

一种解决方案是在调用res_init()之前包装getaddrinfo()函数并调用它(urllib2.urlopen()间接使用它。

您可以尝试以下方法(仍假设您正在使用Linux):

import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')
res_init = libc.__res_init
# ...
res_init()
response = urllib2.urlopen('http://www.google.com')

当然可以通过等到“/etc/resolv.conf”被修改后再调用res_init()来优化。

另一种解决方案是安装,例如nscd(名称服务缓存守护程序)。

答案 1 :(得分:0)

对我来说,这是一个代理问题。 在导入urllib.request之前运行以下命令有帮助

import os
os.environ['http_proxy']=''
response = urllib.request.urlopen('http://www.google.com')