如何使用paramiko查看(记录)文件传输进度?

19 投票
2 回答
13160 浏览
提问于 2025-04-17 07:19

我正在使用Paramiko的SFTPClient在主机之间传输文件。我希望我的脚本能够打印出文件传输的进度,类似于使用scp时看到的输出。

$ scp my_file user@host

user@host password: 

my_file                          100%  816KB 815.8KB/s   00:00

$

有什么好的主意吗?

提前谢谢你!

2 个回答

1

看看@Spencer的回答吧,那是正确的。这里有一些小修改,符合2021年的PEP规范,还有一个取模的操作,可以让输出每隔x MB(或者KB,或者GB)才更新一次。

import logging, enum
from paramiko import SSHClient

class SIZE_UNIT(enum.Enum):
   BYTES = 1
   KB = 2
   MB = 3
   GB = 4

def convert_unit(size_in_bytes: int, unit: SIZE_UNIT):
    """Convert the size from bytes to 
    other units like KB, MB or GB
    """
    if unit == SIZE_UNIT.KB:
        return size_in_bytes/1024
    elif unit == SIZE_UNIT.MB:
        return size_in_bytes/(1024*1024)
    elif unit == SIZE_UNIT.GB:
        return size_in_bytes/(1024*1024*1024)
    else:
        return size_in_bytes
        
def progress(transferred: int, tobe_transferred: int):
    """Return progress every 50 MB"""
    if convert_unit(transferred, SIZE_UNIT.MB) % 50 != 0:
        return
    logging.getLogger().info(
        f"Transferred: "
        f"{convert_unit(transferred, SIZE_UNIT.GB):.2f}GB \t"
        f"out of: {convert_unit(tobe_transferred, SIZE_UNIT.GB):.2f}"
        f"GB")

client = SSHClient()
client.connect(...)
sftp = client.open_sftp()
sftp.get(remotepath, localpath, callback=progress)
32

使用 put函数 的可选回调参数。可以这样做:

def printTotals(transferred, toBeTransferred):
    print "Transferred: {0}\tOut of: {1}".format(transferred, toBeTransferred)

sftp.put("myfile","myRemoteFile",callback=printTotals)

撰写回答