Je télécharge des fichiers sur http et affichant la progression à l'aide de Urllib et le code suivant - qui fonctionne bien:
import sys
from urllib import urlretrieve
urlretrieve('http://example.com/file.zip', '/tmp/localfile', reporthook=dlProgress)
def dlProgress(count, blockSize, totalSize):
percent = int(count*blockSize*100/totalSize)
sys.stdout.write("\r" + "progress" + "...%d%%" % percent)
sys.stdout.flush()
3 Réponses :
quelque chose comme ceci: l'appel "try_one" avec le fonctionnement que vous voulez titrater et le délai d'attente: p>
C'est une bonne solution si vous téléchargez de petits fichiers de taille connue. Si vous ne connaissez pas la taille à l'avance, vous ne saurez pas combien de secondes à passer à try_one code>. Et si vous téléchargez un fichier de 100 Mo, try_one (téléchargeur, 1500) code> n'abandonnera pas avant que 1500 secondes soient écoulées. De préférence, cela quitterait dès qu'il était convaincu que le téléchargement ne finira pas à temps.
Oui, convenu. Merci pour la solution, mais je voudrais annuler en fonction du seuil de débit minimal, non pas si le téléchargement est terminé dans un délai déterminé.
@Holymackerel: Modifiez simplement votre rapport de rapport pour avoir un délai d'attente à 10 secondes et vérifiez le taux. Le problème est un téléchargement suspendu où 0 octets sont xfered et votre code de rapport n'est jamais appelé.
Holymackerel! Utilisez les outils!
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!
Merci, c'est une belle solution mais cela attrape des téléchargements bloqués plutôt que des téléchargements lents.
Cela devrait fonctionner. Il calcule le taux de téléchargement actuel et abandonne s'il est trop bas.
import sys
from urllib import urlretrieve
import time
url = "http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz" # 14.135.620 Byte
startTime = time.time()
class TooSlowException(Exception):
pass
def convertBToMb(bytes):
"""converts Bytes to Megabytes"""
bytes = float(bytes)
megabytes = bytes / 1048576
return megabytes
def dlProgress(count, blockSize, totalSize):
global startTime
alreadyLoaded = count*blockSize
timePassed = time.time() - startTime
transferRate = convertBToMb(alreadyLoaded) / timePassed # mbytes per second
transferRate *= 60 # mbytes per minute
percent = int(alreadyLoaded*100/totalSize)
sys.stdout.write("\r" + "progress" + "...%d%%" % percent)
sys.stdout.flush()
if transferRate < 4 and timePassed > 2: # download will be slow at the beginning, hence wait 2 seconds
print "\ndownload too slow! retrying..."
time.sleep(1) # let's not hammer the server
raise TooSlowException
def main():
try:
urlretrieve(url, '/tmp/localfile', reporthook=dlProgress)
except TooSlowException:
global startTime
startTime = time.time()
main()
if __name__ == "__main__":
main()
Notez que cela ne fonctionnera que dans le cas d'une connexion de ralentissement. La connexion abandonnée plus habituelle ne fonctionnera pas à moins que vous ajoutez un délai d'attente à la prise. Sinon - OK! +1
Vous pouvez susciter une exception dans votre meeachook.
Ouais, élever une exception semble être le moyen populaire d'arrêter de télécharger, d'un look rapide sur Google. Cela n'est pas mentionné dans la documentation cependant, ce qui me fait craindre que cela puisse avoir un comportement inattendu. Par exemple, peut-être que les données sont extraites par un thread dédié et jetant une exception en créer une orpheline et n'arrête pas réellement le téléchargement.