urllib.urlretrieve - hängt Programm auf bei reconnect

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ragi
User
Beiträge: 6
Registriert: Sonntag 7. März 2010, 18:47

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Gleiches Problem mit `urllib2`?
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Es gibt in der urllib2 kein urlretrieve
the more they change the more they stay the same
ragi
User
Beiträge: 6
Registriert: Sonntag 7. März 2010, 18:47

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)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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!
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
ragi
User
Beiträge: 6
Registriert: Sonntag 7. März 2010, 18:47

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?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

veers hat geschrieben:http://docs.python.org/library/socket.h ... ulttimeout

Das hilft vermutlich.
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
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Code: Alles auswählen

import socket
socket.setdefaulttimeout(30)
sollte funktionieren
Wenn es einen Timeout gibts eine socket.timeout Exception => Im Thread anfangen und Thread beenden, notfalls durch sys.exit
the more they change the more they stay the same
ragi
User
Beiträge: 6
Registriert: Sonntag 7. März 2010, 18:47

Vielen Dank, setdefaulttimeout war genau das was ich brauchte.
Antworten