Ответ 1
Это происходит потому, что DNS-имя "www.google.com" не может быть разрешено. Если подключение к Интернету отсутствует, DNS-сервер, вероятно, недоступен для разрешения этой записи.
Кажется, я впервые понял ваш вопрос. Поведение, которое вы описываете, - это Linux, особенность glibc. Он только читает "/etc/resolv.conf" один раз, при загрузке. glibc может быть принудительно перечитать "/etc/resolv.conf" с помощью функции res_init()
.
Одним из решений было бы обернуть 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 (daemon cache службы имен).