urrlib2.urlopen: “Name or service not known” persists when starting script without internet connection

冷暖自知 提交于 2019-11-28 09:52:55

This happens because the DNS name "www.google.com" cannot be resolved. If there is no internet connection the DNS server is probably not reachable to resolve this entry.

It seems I misread your question the first time. The behaviour you describe is, on Linux, a peculiarity of glibc. It only reads "/etc/resolv.conf" once, when loading. glibc can be forced to re-read "/etc/resolv.conf" via the res_init() function.

One solution would be to wrap the res_init() function and call it before calling getaddrinfo() (which is indirectly used by urllib2.urlopen().

You might try the following (still assuming you're using Linux):

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

This might of course be optimized by waiting until "/etc/resolv.conf" is modified before calling res_init().

Another solution would be to install e.g. nscd (name service cache daemon).

For me, it was a proxy problem. Running the following before import urllib.request helped

import os
os.environ['http_proxy']=''
response = urllib.request.urlopen('http://www.google.com')
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!