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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 10:03:37