urrlib2.urlopen: "Name oder Dienst nicht bekannt" bestehen, wenn Start-Skript ohne internet-Verbindung
Habe ich dieses einfache, minimal "arbeiten" - Beispiel unten, öffnet eine Verbindung zu google, der alle zwei Sekunden. Wenn ich dieses Skript ausführen, wenn ich eine funktionierende internet-Verbindung, bekomme ich die Erfolgsmeldung, und wenn ich dann die Verbindung trennen, ich bekomme die Fehler-Meldung, und wenn ich den wieder bekomme ich den Erfolg wieder. So weit, So gut.
Jedoch, wenn ich das Skript starte, wenn das internet getrennt ist, bekomme ich die Fehler Meldungen und wenn ich später verbinden, bekomme ich nie den Erfolg Nachricht. Ich erhalte die Fehlermeldung:
urlopen error [Errno -2] Name oder Dienst nicht bekannt
Was ist Los?
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)
InformationsquelleAutor Ben Ruijl | 2014-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht, weil der DNS-name "www.google.com" kann nicht aufgelöst werden. Wenn es keine internet-Verbindung die DNS-server ist wohl nicht erreichbar zu lösen, dieser Eintrag.
Es scheint, dass ich falsch verstanden, deine Frage das erste mal. Das Verhalten, die Sie beschreiben, ist unter Linux eine Besonderheit der glibc. Es liest nur die "/etc/resolv.conf" einmal, beim laden. glibc kann gezwungen werden, re-read "/etc/resolv.conf" über die
res_init()
Funktion.Eine Lösung wäre, wickeln Sie die
res_init()
- Funktion und rufen Sie vor dem Aufrufgetaddrinfo()
(was indirekt durchurllib2.urlopen()
.Könnten Sie Folgendes versuchen (immer noch vorausgesetzt, du bist mit Linux):
Diese könnten natürlich optimiert werden, indem Sie warten, bis die "/etc/resolv.conf" geändert wird, vor dem Aufruf
res_init()
.Andere Lösung wäre die Installation z.B. nscd (name service cache daemon).
Gut, ja, es ist nicht Plattform-unabhängig. Trotzdem ist es ein glibc-problem, das folgende sollte funktionieren, wenn Ihr code muss die Arbeit auf andere Systeme:
try: import ... except: res_init = lambda:None
InformationsquelleAutor insecure
Für mich, es war ein proxy-problem.
Mit dem folgenden vor dem import das urllib.Anfrage geholfen
InformationsquelleAutor Sridhar Thiagarajan