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).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…