在 Python 脚本中加入进度条显示通常可以通过第三方库来实现。具体到文件传输的场景,可以使用 tqdm
库来显示进度条,无论是使用 Paramiko 还是 SCP 命令都可以适用。下面分别介绍如何在这两种情况下添加进度条显示。
使用 tqdm
显示进度条
首先,确保已经安装 tqdm
库:
1. 使用 Paramiko 实现文件传输并显示进度条
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import paramiko from tqdm import tqdm import os
hostname = 'your_linux_server_ip' port = 22 username = 'your_linux_username' password = 'your_linux_password'
local_path = r'C:\path\to\your\file.txt'
remote_path = '/home/your_username/file.txt'
local_file_size = os.path.getsize(local_path)
ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname, port, username, password)
sftp = ssh.open_sftp()
with tqdm(total=local_file_size, unit='B', unit_scale=True, desc=f'Uploading {os.path.basename(local_path)}') as pbar: def callback(data_transferred, total_size): pbar.update(data_transferred - pbar.n)
sftp.put(local_path, remote_path, callback=callback)
sftp.close() ssh.close()
print(f"File {os.path.basename(local_path)} transferred successfully to {hostname}:{remote_path}")
|
tqdm(total=local_file_size, unit='B', unit_scale=True, desc=f'Uploading {os.path.basename(local_path)}')
:设置进度条,total
参数设置为文件大小,desc
参数设置进度条描述。
callback
函数用于在传输过程中更新进度条。
2. 使用 SCP 命令和 subprocess
实现文件传输并显示进度条
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import subprocess from tqdm import tqdm import os
local_path = r'C:\path\to\your\file.txt'
remote_path = 'your_linux_username@your_linux_server_ip:/home/your_username/file.txt'
local_file_size = os.path.getsize(local_path)
scp_command = f'scp "{local_path}" {remote_path}'
with tqdm(total=local_file_size, unit='B', unit_scale=True, desc=f'Copying {os.path.basename(local_path)}') as pbar: def update_progress(chunk): pbar.update(chunk)
try: process = subprocess.Popen(scp_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: output = process.stderr.read(1024) if output: update_progress(len(output)) else: break process.wait() except Exception as e: print(f"Error occurred: {e}")
print(f"File {local_path} transferred successfully to {remote_path}")
|
tqdm(total=local_file_size, unit='B', unit_scale=True, desc=f'Copying {os.path.basename(local_path)}')
:设置进度条,total
参数设置为文件大小,desc
参数设置进度条描述。
update_progress
函数用于在传输过程中更新进度条。
注意事项
- 在使用 Paramiko 或者 SCP 命令传输文件时,进度条的更新通常依赖于回调函数或者实时读取输出流的长度。
tqdm
库提供了丰富的配置选项,可以根据需求进行进一步定制,比如调整单位、显示格式等。
- 确保在传输大文件时,进度条的更新是基于传输数据量而不是文件读写操作的频率,以确保进度条的准确性和平滑显示。