HolyMackerel! Usa las herramientas!
import urllib2, sys, socket, time, os
def url_tester(url = "http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz"):
file_name = url.split('/')[-1]
u = urllib2.urlopen(url,None,1) # Note the timeout to urllib2...
file_size = int(u.info().getheaders("Content-Length")[0])
print ("\nDownloading: {} Bytes: {:,}".format(file_name, file_size))
with open(file_name, 'wb') as f:
file_size_dl = 0
block_sz = 1024*4
time_outs=0
while True:
try:
buffer = u.read(block_sz)
except socket.timeout:
if time_outs > 3: # file has not had activity in max seconds...
print "\n\n\nsorry -- try back later"
os.unlink(file_name)
raise
else: # start counting time outs...
print "\nHmmm... little issue... I'll wait a couple of seconds"
time.sleep(3)
time_outs+=1
continue
if not buffer: # end of the download
sys.stdout.write('\rDone!'+' '*len(status)+'\n\n')
sys.stdout.flush()
break
file_size_dl += len(buffer)
f.write(buffer)
status = '{:20,} Bytes [{:.2%}] received'.format(file_size_dl,
file_size_dl * 1.0/file_size)
sys.stdout.write('\r'+status)
sys.stdout.flush()
return file_name
Imprime el estado como se esperaba. Si desconecto mi cable ethernet, me sale:
Downloading: Python-2.7.3.tgz Bytes: 14,135,620
827,392 Bytes [5.85%] received
sorry -- try back later
Si desconecto el cable, y luego vuelva a enchufarlo en menos de 12 segundos, consigo:
Downloading: Python-2.7.3.tgz Bytes: 14,135,620
716,800 Bytes [5.07%] received
Hmmm... little issue... I'll wait a couple of seconds
Hmmm... little issue... I'll wait a couple of seconds
Done!
El archivo se ha descargado correctamente.
Puede ver que urllib2 admite tanto el tiempo de espera como la reconexión. Si se desconecta y permanece desconectado durante 3 * 4 segundos == 12 segundos, se interrumpirá definitivamente y generará una excepción fatal. Esto podría tratarse también.
Puede generar una excepción en su reporthook. – Tobold
Sí, levantar una excepción parece ser la manera más popular de detener la descarga, de una rápida mirada a Google. Sin embargo, no se menciona en la documentación, lo que me preocupa que pueda tener un comportamiento inesperado. Por ejemplo, tal vez los datos sean obtenidos por un hilo dedicado, y lanzar una excepción lo hará huérfano y no detendrá la descarga. – Kevin