urrlib2.urlopen:在没有互联网连接的情况下启动脚本时仍然存在"Name or service not known"



我在下面有一个简单的最小'工作示例,它每两秒钟打开与Google的连接。当我有一个工作的Internet连接时运行此脚本时,我会收到成功消息,然后断开连接时,我会收到失败消息,当我再次重新连接时,我再次获得成功。到目前为止,一切都很好。

但是,当我断开Internet时启动脚本时,我会收到失败消息,稍后连接时,我再也不会收到成功消息。我一直遇到错误:

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)

发生这种情况,因为无法解决DNS名称" www.google.com"。如果没有Internet连接,则可能无法达到DNS服务器来解决此条目。

看来我第一次误解了您的问题。您描述的行为是在Linux上是Glibc的特殊性。加载时,它仅读取"/etc/resolv.conf"一次。可以通过res_init()函数强迫GLIBC重新阅读"/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(名称服务缓存守护程序)。

对我来说,这是一个代理问题。在import urllib.request帮助之前运行以下操作

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

相关内容

  • 没有找到相关文章

最新更新