2016-02-29 2 views
2

У меня есть консольный скрипт, который использует ftplib в качестве бэкэнд для получения нескольких файлов с ftp-сервера. Я хотел бы использовать tqdm, чтобы дать пользователю некоторую обратную связь при условии, что у них есть «подробный» переключатель. Этот должен быть необязательным, поскольку некоторые пользователи могут использовать сценарий без доступа tty.ftplib Python с tdqm

Метод ftplibretrbinary принимает обратный вызов, поэтому его можно было бы подключить tqdm. Однако я понятия не имею, как будет выглядеть этот обратный вызов.

ответ

2

От FTP.retrbinary:

Функция обратного вызова вызывается для каждого блока данных, полученных с одной строки аргумента, давая блок данных.

Так что обратный вызов может быть что-то вроде:

with open(filename, 'wb') as fd: 
    total = ftpclient.size(filename) 

    with tqdm(total=total) as pbar: 
     def cb(data): 
      l = len(data) 
      pbar.update(l) 
      fd.write(data) 

    ftpclient.retrbinary('RETR {}'.format(filename), cb) 

Осторожно: Этот код не тестировался, и, вероятно, должен быть адаптирован.

2

Этот код не должен работать как pbar будет «закрыт», когда блок with завершается, что происходит непосредственно перед ftpclient.retrbinary(...). Вам нужны очень незначительные отступа моды:

with open(filename, 'wb') as fd: 
    total = ftpclient.size(filename) 

    with tqdm(total=total, 
       unit='B', unit_scale=True, unit_divisor=1024, 
       disable=not verbose) as pbar: 
     def cb(data): 
      pbar.update(len(data)) 
      fd.write(data) 

     ftpclient.retrbinary('RETR {}'.format(filename), cb) 

EDIT добавлен disable флага и байты масштабирование

Смежные вопросы