升级至Mac OS 10.13后使用shutil.copyfile()随机报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

