urrlib2.urlopen:在没有Internet连接的情况下启动脚本时,"名称或服务未知"仍然存在

 520文雅_293 发布于 2023-01-31 13:15

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

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

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)

insecure.. 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(名称服务缓存守护进程).

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有