如何在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
相关产品推荐
相关产品推荐

