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

升级至Mac OS 10.13后使用shutil.copyfile()随机报I/O错误求助

解决High Sierra下shutil.copyfile()随机报-36 I/O错误的办法

我之前在High Sierra刚升级后也碰到过类似的随机I/O错误,尤其用Python标准库做文件操作时,这种偶发问题确实头疼。结合你的情况,给你几个实际可行的排查和解决方向:

  • 排查文件占用情况
    这个-36错误大概率是目标文件被后台进程临时锁定导致的。APFS的文件锁机制和旧的HFS+有差异,像Finder预览、Time Machine备份、第三方杀毒软件这类进程,经常会悄悄锁定文件造成写入失败。你可以在错误发生时,用lsof | grep "你的目标文件路径"命令查看哪个进程在占用文件,必要时暂时关闭这些后台进程测试。

  • 给复制操作加重试机制
    既然是随机报错,最有效的办法就是给shutil.copyfile()加自动重试逻辑。系统层面的临时I/O阻塞通常持续时间很短,重试1-3次就能解决。这里给你一个封装好的健壮版复制函数:

    import shutil
    import time
    from functools import wraps
    
    def retry_on_io_error(max_retries=3, delay=1):
        def decorator(func):
            @wraps(func)
            def wrapper(src, dst, *args, **kwargs):
                retries = 0
                while retries < max_retries:
                    try:
                        return func(src, dst, *args, **kwargs)
                    except OSError as e:
                        if e.errno == -36:
                            retries += 1
                            time.sleep(delay)
                        else:
                            raise
                raise RuntimeError(f"复制失败:已重试{max_retries}次仍未成功")
            return wrapper
        return decorator
    
    # 使用装饰器包装原方法
    @retry_on_io_error(max_retries=3, delay=1)
    def robust_copy(src, dst):
        shutil.copyfile(src, dst)
    

    把你原来调用shutil.copyfile()的地方换成robust_copy()即可,大部分偶发错误都能被这个逻辑覆盖。

  • 检查APFS分区健康
    升级到High Sierra后自动切换到APFS的话,可能存在分区的微小损坏或者权限异常。打开「磁盘工具」,选中你的系统分区,点击「急救」按钮,让系统自动检测并修复APFS的潜在问题。修复完成后重启Mac,有时候能解决底层的I/O异常。

  • 调整文件操作节奏
    如果你的代码是批量处理文件,尽量避免在短时间内对同一目录下的文件进行密集读写。可以在复制操作之间加time.sleep(0.1)这样的短暂延迟,降低触发系统I/O并发限制的概率。

这个错误属于APFS和Python标准库交互的边缘情况,Apple文档里没相关内容很正常。我当时就是靠重试机制彻底解决的,你可以先试试这个方案,应该能解决大部分问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:23:12