You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Paramiko SFTPFile写入时运行循环输出进度信息

解决Paramiko SFTPFile写入大文件时的实时调试输出问题

Paramiko的SFTPFile.write()是同步阻塞方法,调用后会一直等待数据全部写入远程服务器才会返回,不会返回"IN_PROGRESS"这类中间状态,所以你设想的while循环判断写入进度的方式无法直接实现。不过可以通过以下两种方式实现实时调试输出:

方案1:手动分块写入数据

将大的my_data拆分成小块,逐块写入并输出进度信息,这是最直接且可控的方式:

import time

remote_zip_file = sftp_client.file(file_name_with_path, "wb")

chunk_size = 1024 * 1024  # 按1MB分片,可根据需求调整
total_bytes = len(my_data)
written_bytes = 0

while written_bytes < total_bytes:
    # 截取当前要写入的分片
    chunk = my_data[written_bytes : written_bytes + chunk_size]
    # 写入分片并获取实际写入的字节数
    bytes_written = remote_zip_file.write(chunk)
    written_bytes += bytes_written
    # 输出调试信息,可自定义格式
    print(f"写入进度:{written_bytes}/{total_bytes} 字节 ({(written_bytes/total_bytes)*100:.1f}%)")
    # 可选:添加短暂延迟避免输出过于频繁
    time.sleep(0.1)

# 务必关闭文件
remote_zip_file.close()

这种方式的优势是能精准跟踪写入进度,每块数据写入完成后立即反馈状态,完全符合SFTP协议的分块传输逻辑。

方案2:多线程分离写入与状态输出

如果不想手动拆分数据,可以将写入操作放到单独线程中,主线程循环输出状态直到写入完成:

import time
import threading

def perform_write():
    try:
        remote_zip_file.write(my_data)
    finally:
        remote_zip_file.close()

remote_zip_file = sftp_client.file(file_name_with_path, "wb")

# 启动写入线程
write_thread = threading.Thread(target=perform_write)
write_thread.start()

# 主线程循环输出调试信息
while write_thread.is_alive():
    print("文件正在写入远程SFTP服务器...")
    time.sleep(1)

print("文件写入完成")

注意:此方案中只有一个线程操作SFTPFile对象,不存在线程安全问题;如果需要更精确的进度,可结合方案1的分块逻辑,在写入线程中更新进度变量,主线程读取该变量输出详细进度。

内容的提问来源于stack exchange,提问作者Jwok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:54:59