如何使用paramiko查看(记录)文件传输进度?
我正在使用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)