Seite 1 von 1
urllib.urlretrieve - hängt Programm auf bei reconnect
Verfasst: Samstag 24. April 2010, 19:20
von ragi
hoi,
ich habe ein Script was mittels urllib.urlretrieve downloaded. Wenn aber die Verbindung zum Internet währed des Downloades abbricht, dann hängt das Script an der Stelle des urllib.urlretrieve.
Gibt es eine Möglichkeit urllib.urlretrieve zu unterbrechen?
und warum wird kein Fehler geworfen?
Code: Alles auswählen
try:
urllib.urlretrieve(nextdl,file_name,stat)
except:
print "failed"
Gruß
Ragi
Verfasst: Samstag 24. April 2010, 20:26
von ms4py
Gleiches Problem mit `urllib2`?
Verfasst: Samstag 24. April 2010, 20:28
von Dav1d
Es gibt in der urllib2 kein urlretrieve
Verfasst: Samstag 24. April 2010, 20:57
von ragi
Nein mit urllib2 gehts auch nicht,
Code: Alles auswählen
def download2(url,name):
f=urlopen(url)
wf=open(name, 'w')
size=f.info()['content-length']
count=0.0
while count<float(size):
try:
data=f.read(5000)
count+=5000
wf.write(data)
except:
break;
muss ich jetzt echt auf Sockebene das ganze implementieren?
ich meine es ist ja was ganz banales das mal eine Verbindung zusammen bricht. (in meinem Fall der 24h reconnect des ISPs)
Verfasst: Samstag 24. April 2010, 21:14
von ms4py
Dav1d hat geschrieben:Es gibt in der urllib2 kein urlretrieve
Der OP hat verstanden, wie es gemeint war
ragi hat geschrieben:muss ich jetzt echt auf Sockebene das ganze implementieren?
Nein, ich könnte mir eine Lösung mit Threads vorstellen mit einem Event als Watchdog-Variable. Wenn das Event nach x-Sekunden nicht gesetzt wurde, wirfst du halt einen `TimeoutError`.
Edit: Verwende bitte mal PEP8, die fehlenden Leerzeichen machen deinen Code schwer leserlich!
Verfasst: Montag 26. April 2010, 07:29
von ragi
Also ich konrolliere einfach die lokale Dateigröße, ob die sich ändert. So weiss ich wenn der Download ins leere läuft.
Wie bekomme ich nun den thread mit dem urlretrieve "gekillt" oder wie komme ich im Script über den Punkt hinaus?
Verfasst: Montag 26. April 2010, 08:03
von ms4py
ragi hat geschrieben:Also ich konrolliere einfach die lokale Dateigröße, ob die sich ändert. So weiss ich wenn der Download ins leere läuft.
Wie bekomme ich nun den thread mit dem urlretrieve "gekillt" oder wie komme ich im Script über den Punkt hinaus?
In dem du den Thread als "Daemon" markierst:
http://docs.python.org/library/threadin ... ead.daemon
Verfasst: Montag 26. April 2010, 09:35
von veers
http://docs.python.org/library/socket.h ... ulttimeout
Das hilft vermutlich.
ms4py, naja dann hast du einfach solange bis die ganze Anwendung beendet wird einen Zombie. Auch nicht gerade hübsch.
Gruss,
Jonas
Verfasst: Montag 26. April 2010, 10:14
von ms4py
Oh, na klar. Vermutlich gilt diese Einstellung auch für die Socket-abstrahierenden Module. Soweit habe ich gar nicht gedacht.
veers hat geschrieben:ms4py, naja dann hast du einfach solange bis die ganze Anwendung beendet wird einen Zombie. Auch nicht gerade hübsch.
Ja, da hast du Recht. Kommt natürlich auf die Laufzeit der Anwendung an. Wenn man von einem kleinen Script ausgeht, das sich bei einem Timeout sowieso beendet, wäre diese Lösung kein Problem.
Ansonsten wäre `multiprocessing` eine Alternative, einen `Process` kann man ja beenden:
http://docs.python.org/library/multipro ... .terminate
Verfasst: Montag 26. April 2010, 15:01
von Dav1d
sollte funktionieren
Wenn es einen Timeout gibts eine socket.timeout Exception => Im Thread anfangen und Thread beenden, notfalls durch sys.exit
Verfasst: Dienstag 27. April 2010, 06:03
von ragi
Vielen Dank, setdefaulttimeout war genau das was ich brauchte.