Python urrlib2.urlopen:“文件”;“名称或服务未知”;在没有internet连接的情况下启动脚本时持续

Python urrlib2.urlopen:“文件”;“名称或服务未知”;在没有internet连接的情况下启动脚本时持续,python,urllib2,Python,Urllib2,我下面有一个简单的最小“工作”示例,它每两秒钟打开一个到google的连接。当我在互联网连接正常的情况下运行此脚本时,我会收到成功消息,当我断开连接时,我会收到失败消息,当我再次重新连接时,我会再次收到成功消息。到目前为止,一切顺利 但是,当我在internet断开连接时启动脚本时,会收到失败消息,而当我稍后连接时,则从未收到成功消息。我不断得到错误: urlopen错误[Errno-2]名称或服务未知 发生了什么事 导入urllib2,时间 尽管如此: 尝试: 打印('正在尝试') respo

我下面有一个简单的最小“工作”示例,它每两秒钟打开一个到google的连接。当我在互联网连接正常的情况下运行此脚本时,我会收到成功消息,当我断开连接时,我会收到失败消息,当我再次重新连接时,我会再次收到成功消息。到目前为止,一切顺利

但是,当我在internet断开连接时启动脚本时,会收到失败消息,而当我稍后连接时,则从未收到成功消息。我不断得到错误:

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

发生了什么事

导入urllib2,时间
尽管如此:
尝试:
打印('正在尝试')
response=urllib2.urlopen('http://www.google.com')
打印(‘成功’)
时间。睡眠(2)
除例外情况外,e:
打印('Fail'+str(e))
时间。睡眠(2)

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

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

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

您可以尝试以下方法(仍然假设您使用的是Linux):

这当然可以通过在调用
res\u init()
之前等待“/etc/resolv.conf”被修改来优化


另一个解决方案是安装nscd(名称服务缓存守护进程)。

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

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

我确实在使用Linux。遗憾的是,没有更好的平台独立解决方案。无论如何,谢谢你的解释!好吧,是的,它不是平台独立的。无论如何,因为它是一个glibc问题,如果你的代码必须在其他系统上工作,那么以下应该可以工作:
尝试:导入…除了:res_init=lambda:None
注意对于Python3.x,urllib2是不推荐的
import os
os.environ['http_proxy']=''
response = urllib.request.urlopen('http://www.google.com')