Python 2.6 urlib2-Zeitüberschreitungsproblem

Es scheint, ich kann das nicht bekommenurllib2 Zeitüberschreitung, die berücksichtigt werden muss. Ich habe - ich nehme an - alle Beiträge zu diesem Thema gelesen und anscheinend mache ich nichts falsch. Hab ich recht? Vielen Dank für Ihre freundliche Hilfe.

Szenario:

Ich muss die Internetverbindung überprüfen, bevor ich mit dem Rest eines Skripts fortfahren kann. Ich habe dann eine Funktion (Net_Access) geschrieben, die unten angegeben ist.

Wenn ich diesen Code mit angeschlossener LAN- oder Wifi-Schnittstelle und durch Überprüfen eines vorhandenen Hostnamens ausführe, ist alles in Ordnung, da kein Fehler oder Problem vorliegt und somit keine Zeitüberschreitung.Wenn ich meinen LAN-Konnektor abziehe oder nach einem nicht vorhandenen Hostnamen suche, wird der Zeitüberschreitungswert anscheinend ignoriert. Was ist bitte mit meinem Code los?

Einige Infos:

Ubuntu 10.04.4 LTS (läuft auf einer VirtualBox v4.2.6-VM, Host-Betriebssystem ist MAC OS X Lion)cat /proc/sys/kernel/osrelease: 2.6.32-42-genericPython 2.6.5

Mein Code:

#!/usr/bin/env python

import socket
import urllib2

myhost = 'http://www.google.com'
timeout = 3

socket.setdefaulttimeout(timeout)
req = urllib2.Request(myhost)

try:
    handle = urllib2.urlopen(req, timeout = timeout)
except urllib2.URLError as e:
    socket.setdefaulttimeout(None)
    print ('[--- Net_Access() --- No network access')
else:
    print ('[--- Net_Access() --- Internet Access OK')

1) Arbeiten mit eingestecktem LAN-Stecker

$ $ time ./Net_Access 
[--- Net_Access() --- Internet Access OK

real    0m0.223s
user    0m0.060s
sys 0m0.032s

2) Timeout funktioniert nicht, wenn der LAN-Stecker abgezogen ist

$ time ./Net_Access 
[--- Net_Access() --- No network access

real    1m20.235s
user    0m0.048s
sys 0m0.060s

Zum ursprünglichen Beitrag hinzugefügt: Testergebnisse (mit IP anstelle von FQDN)

Wie von @unutbu vorgeschlagen (siehe Kommentare), behebt das Ersetzen des FQDN in myhost durch eine IP-Adresse das Problem: Die Zeitüberschreitung wird wirksam.

LAN-Anschluss eingesteckt ...
$ time ./Net_Access [--- Net_Access () --- Internetzugang OK

real    0m0.289s
user    0m0.036s
sys 0m0.040s

LAN-Stecker abgezogen ...
$ time ./Net_Access [--- Net_Access () --- Kein Netzwerkzugriff

real    0m3.082s
user    0m0.052s
sys 0m0.024s

Das ist schön, aber es bedeutet, dass das Timeout nur mit IP und nicht mit FQDN verwendet werden kann. Seltsam...

Hat jemand eine Möglichkeit gefunden, das Zeitlimit für urllib2 zu verwenden, ohne die DNS-Auflösung zu aktivieren und die IP-Adresse an die Funktion zu übergeben? Oder testen Sie die Verbindung zunächst mit Socket und starten dann urllib2, wenn Sie sicher sind, dass Sie das Ziel erreichen können?

Danke vielmals.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage