Python ProgressBar для загрузки по FTP не работает - PullRequest
2 голосов
/ 11 апреля 2019

Я пытаюсь использовать прогрессбар для отображения прогресса загрузки файла FTP (ftplib), но прогресс не обновляется правильно.Скорость начинается с высокой, а затем постепенно уменьшается (до байтов).Загрузка завершится через несколько секунд, пока индикатор выполнения все еще на 0%.Похоже, я не обновляю прогресс правильно и не уверен, как это исправить.

Я пробовал решение, которое нашел здесь Показать прогресс загрузки FTP в Python (ProgressBar) с использованием pbar += len(data)но это дало мне следующую ошибку:

Traceback (most recent call last):                                                             ] ETA:  --:--:--   0.00  B/s
  File "ftp.py", line 38, in <module>
    ftp.retrbinary('RETR ' + file, file_write)
  File "/usr/lib/python3.5/ftplib.py", line 446, in retrbinary
    callback(data)
  File "ftp.py", line 29, in file_write
    pbar += len(data)
TypeError: unsupported operand type(s) for +=: 'ProgressBar' and 'int'

Так что я настроил ее, добавив pbar.update(len(data)) к моей функции file_write() и заставил ее работать без ошибок, но, как я уже сказал, скорость совершенно неправильная,продолжает падать (пока не достигнет 0, вероятно), а затем просто внезапно завершается.

Вот весь мой сценарий:

from ftplib import FTP_TLS
import time

from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
    AdaptiveETA, FileTransferSpeed, FormatLabel, Percentage, \
    ProgressBar, ReverseBar, RotatingMarker, \
    SimpleProgress, Timer, UnknownLength

ftp_host = 'domain.com'
ftp_port = 21
ftp_user = 'user'
ftp_pass = 'pass'

ftp = FTP_TLS()

ftp.connect(ftp_host, ftp_port)
ftp.login(ftp_user, ftp_pass)
ftp.cwd('/videos')

files = ftp.nlst()

widgets = ['Downloading: ', Percentage(), ' ', Bar(marker='#', \
            left='[',right=']'), ' ', ETA(), ' ', FileTransferSpeed()]

def file_write(data):
    localfile.write(data)
    global pbar
    pbar.update(len(data))
    #pbar += len(data)

for file in files:
    size = ftp.size(file)
    pbar = ProgressBar(widgets = widgets, maxval = size)
    pbar.start()

    localfile = open('/local/videos/' + file, 'wb')

    ftp.retrbinary('RETR ' + file, file_write)

    pbar.finish() 
    localfile.close()

ftp.quit()

Любая помощь будет высоко цениться, чтобы этот код работал так, как должен.

ОБНОВЛЕНИЕ:

Я сделал следующие дополнения / изменения и получил правильную скорость / прогресс-бар:

i = 0
def file_write(data):
    localfile.write(data)
    global pbar, i
    pbar.update(i * 1024 * 10)
    i+=1
    #pbar += len(data)

, но так же, какэто скоро закончится, я получаю эту ошибку:

Traceback (most recent call last):################################################## ] ETA:  0:00:00  45.62 MB/s
  File "ftp.py", line 42, in <module>
    ftp.retrbinary('RETR ' + file, file_write)
  File "/usr/lib/python3.5/ftplib.py", line 446, in retrbinary
    callback(data)
  File "ftp.py", line 30, in file_write
    pbar.update(o * 1024 * 10)
  File "/usr/local/lib/python3.5/dist-packages/progressbar/progressbar.py", line 250, in update
    raise ValueError('Value out of range')
ValueError: Value out of range

Я использую ProgressBar 2.5 (последний) и Python 3.5.

1 Ответ

0 голосов
/ 12 апреля 2019

Код на самом деле для progressbar2 библиотеки .

Его ProgressBar класс реализует __iadd__.

...