Расчет оставшегося времени передачи файла в Paramiko - PullRequest
0 голосов
/ 31 мая 2018

Вот мой код:

def send_file(self,source,destination):
        self.client.open_sftp().put(source,destination,self.upload_status)

def upload_status(self,sent,size):    
    sent_mb=round(sent/1000000,1)
    remaining_mb=round((size-sent)/1000000,1)
    size=round(size/1000000,1)
    sys.stdout.write("Total size:{0} MB|Sent:{1} MB|Remaining:{2} MB".
        format(size,sent_mb,remaining_mb))
    sys.stdout.write('\r')

Я получаю следующий вывод:

Общий размер: 30,6 | Отправлено: 30,5 МБ | Осталось: 0,1 МБ

Мой ожидаемый вывод:

Общий размер: 30,6 | Отправлено: 30,5 МБ | Осталось: 0,1 МБ | Оставшееся время: 00: 00: 01

Есть ли в Paramiko какой-либо модуль, который может дать мне метку времени?Если нет, то как мне этого добиться?

1 Ответ

0 голосов
/ 31 мая 2018
  • Запомните время, когда началась передача;
  • При каждом обновлении подсчитайте, сколько времени уже происходит передача;
  • На основании этого рассчитайте скорость передачи;
  • Исходя из этого, подсчитайте, сколько времени займет передача остальных.
import datetime

# ...

start = datetime.datetime.now()

def upload_status(self, sent, size):
    sent_mb = round(float(sent) / 1000000, 1)
    remaining_mb = round(float(size - sent) / 1000000, 1)
    size_mb = round(size / 1000000, 1)
    time = datetime.datetime.now()
    elapsed = time - start
    if sent > 0:
        remaining_seconds = elapsed.total_seconds() * (float(size - sent) / sent)
    else:
        remaining_seconds = 0
    remaining_hours, remaining_remainder = divmod(remaining_seconds, 3600)
    remaining_minutes, remaining_seconds = divmod(remaining_remainder, 60)
    print(
        ("Total size:{0} MB|Sent:{1} MB|Remaining:{2} MB|" +
         "Time remaining:{3:02}:{4:02}:{5:02}").
        format(
            size_mb, sent_mb, remaining_mb,
            int(remaining_hours), int(remaining_minutes), int(remaining_seconds)))

Также обратите внимание, что ваш расчет MB работает только в Python 3.В Python 2 вы будете чередовать все цифры.Я исправил это путем приведения к float.

...