Revisamos de forma cada secciones en nuestro espacio con la meta de mostrarte siempre información veraz y actualizada.
Solución:
La sugerencia en la otra respuesta no progresó para mí más allá del 1%. Aquí hay una implementación completa que me funciona en Python 3:
import progressbar
import urllib.request
pbar = None
def show_progress(block_num, block_size, total_size):
global pbar
if pbar is None:
pbar = progressbar.ProgressBar(maxval=total_size)
pbar.start()
downloaded = block_num * block_size
if downloaded < total_size:
pbar.update(downloaded)
else:
pbar.finish()
pbar = None
urllib.request.urlretrieve(model_url, model_file, show_progress)
Creo que la mejor solución es crear una clase que tenga todo el estado necesario.
class MyProgressBar():
def __init__(self):
self.pbar = None
def __call__(self, block_num, block_size, total_size):
if not self.pbar:
self.pbar=progressbar.ProgressBar(maxval=total_size)
self.pbar.start()
downloaded = block_num * block_size
if downloaded < total_size:
self.pbar.update(downloaded)
else:
self.pbar.finish()
y llama :
urllib.request.urlretrieve('img_url', 'img_filename', MyProgressBar())
El gancho se define como:
urlretrieve(url[, filename[, reporthook[, data]]])
"El tercer argumento, si está presente, es una función de enlace que se llamará una vez al establecerse la conexión de red y una vez después de cada bloque leído a partir de entonces. Al enlace se le pasarán tres argumentos: un recuento de bloques transferidos hasta el momento, un tamaño de bloque en bytes y el tamaño total del archivo. El tercer argumento puede ser -1 en servidores FTP más antiguos que no devuelven un tamaño de archivo en respuesta a una solicitud de recuperación. "
Entonces, puedes escribir un gancho de la siguiente manera:
# Global variables
pbar = None
downloaded = 0
def show_progress(count, block_size, total_size):
if pbar is None:
pbar = ProgressBar(maxval=total_size)
downloaded += block_size
pbar.update(block_size)
if downloaded == total_size:
pbar.finish()
pbar = None
downloaded = 0
Como nota al margen, le recomiendo encarecidamente que use la biblioteca de solicitudes, que es mucho más fácil de usar y puede iterar sobre la respuesta con el iter_content()
método.
Acuérdate de que puedes optar por la opción de añadir una tasación acertada si te ayudó.