Python目录复制删除遇网络错误的重试实现方法
问题答复
首先你写的删除重试代码无法正常运行,存在两个核心问题:
- 第一是缩进语法错误:
shutil.rmtree(target_directory)这行没有正确缩进在try代码块内部,Python解析时会直接抛出IndentationError,脚本根本启动不了。 - 第二是逻辑硬伤:这是无限重试逻辑,既没有设置最大重试次数,也没有做异常范围筛选、重试间隔控制,如果遇到权限不足、文件被永久占用这类重试无法解决的错误,脚本会一直空转死循环,占满CPU资源。
给复制操作加重试不建议单独零散写while循环,最优方案是把重试逻辑抽成通用的可复用组件,同时给删除、复制操作都套上重试规则,支持自定义最大重试次数、重试间隔,且只捕获IO错误、网络错误这类临时故障,避免无脑吞掉所有异常导致问题难排查。
可直接落地的实现代码
import shutil import os import time from functools import wraps def retry(max_retries=3, retry_interval=2, catch_exceptions=(IOError, OSError)): """通用重试装饰器 :param max_retries: 最大重试次数 :param retry_interval: 每次重试前的等待秒数 :param catch_exceptions: 只捕获指定的可重试临时异常,避免吞掉权限错误、参数错误等永久问题 """ def decorator(func): @wraps(func) def run_with_retry(*args, **kwargs): last_error = None for attempt in range(max_retries + 1): try: return func(*args, **kwargs) except catch_exceptions as e: last_error = e if attempt < max_retries: print(f"操作[{func.__name__}]执行失败,{retry_interval}秒后开始第{attempt+1}次重试,错误信息:{str(e)}") time.sleep(retry_interval) continue raise last_error return run_with_retry return decorator # 给删除、复制操作分别绑定重试规则,可根据网络情况自行调整参数 @retry(max_retries=5, retry_interval=3) def _remove_target_dir(dir_path): shutil.rmtree(dir_path) @retry(max_retries=5, retry_interval=3) def _copy_dir_content(root_path, target_path): shutil.copytree(root_path, target_path) def copy_directory(root_directory, target_directory): # 前置校验源目录,避免无意义重试 if not os.path.isdir(root_directory): raise NotADirectoryError(f"源目录 {root_directory} 不存在,无法执行复制") if os.path.isdir(target_directory): _remove_target_dir(target_directory) _copy_dir_content(root_directory, target_directory) # 调用示例 # copy_directory(path_folderA, path_folderAcopy)
方案优势
- 无死循环风险:支持自定义最大重试次数,重试次数耗尽后会直接抛出最后捕获的错误,不会一直空转。
- 异常捕获可控:默认只捕获IO、系统层面的临时错误,不会吞掉代码错误、权限错误这类无法通过重试解决的问题,方便排查故障。
- 重试逻辑合理:失败后增加等待间隔,既给网络恢复留出缓冲时间,也不会高频请求打挂网络存储服务。
- 代码结构清晰:重试、删除、复制逻辑各自独立,后续要调整参数、加日志、改规则都不需要改动核心流程。
- 前置校验减少无效操作:执行前先检查源目录状态,源目录不存在时直接报错,不浪费重试资源。
如果操作的是NFS、SMB这类网络挂载目录,还可以在重试逻辑里增加简单的目录可达性、读写权限校验,进一步减少无效重试。
内容的提问来源于stack exchange,提问作者AzUser1
相关产品推荐
相关产品推荐

