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

Python中重命名文件触发‘设备或资源忙’错误,求解决方案

解决Python中os.rename()触发Errno 16 "设备或资源忙"的问题

嘿,我来帮你搞定这个os.rename()的报错问题!你遇到的[Errno 16] 设备或资源忙,本质是你要操作的文件/路径正被其他进程或者当前脚本的其他部分占用,导致系统没法完成重命名操作。先看看你提供的异常栈:

Traceback (most recent call last):
File "/home/jiewei/PycharmProjects/TestEngine/test/test_multiple_classes.py", line 23, in test_create_symlink_and_run_test_in_devbench_but_is_called_in_vdi
self.sm.make_backups(self.dev_path)
File "testengine/SymlinkManger.py", line 24, in make_backups
self.make_backup(file_path)
File "testengine/SymlinkManger.py", line 19, in make_backup
os.rename(file_path, new_name)
OSError: [Errno 16] Device or resource busy

可能的原因

  • 目标文件正被当前脚本的其他线程/未关闭的文件句柄占用
  • 外部程序(比如文本编辑器、终端会话、后台服务)正在使用该文件或所在目录
  • 如果是符号链接相关操作,链接的目标资源正被占用,或者操作的目录是挂载点且处于活跃使用状态

实用解决方案

  • 确保文件句柄已释放
    要是你之前打开过这个文件,一定要确保调用close()关闭它,或者更稳妥的是用上下文管理器with open(...),它会自动帮你释放文件句柄:

    # 正确示例:用上下文管理器管理文件
    with open(file_path, 'r') as f:
        # 在这里处理文件内容
    # 退出with块后,文件已自动关闭,此时再执行重命名
    os.rename(file_path, new_name)
    
  • 排查并终止外部占用进程
    在Linux系统下,你可以用lsof <file_path>或者fuser <file_path>命令找出正在占用该文件的进程,找到后终止对应的进程再重试操作。比如:

    lsof /path/to/your/file
    
  • 添加延迟重试逻辑
    如果是并发场景下的临时占用,可以给重命名操作加个重试机制,等待一会儿再尝试:

    import os
    import time
    
    def safe_rename(src, dst, retries=3, delay=2):
        for attempt in range(retries):
            try:
                os.rename(src, dst)
                print("重命名成功!")
                return
            except OSError as e:
                if e.errno == 16 and attempt < retries - 1:
                    print(f"资源忙,{delay}秒后重试...")
                    time.sleep(delay)
                else:
                    # 重试失败,抛出原异常
                    raise
    
  • 检查挂载状态
    如果你操作的目录是挂载点,先确认没有进程把这个目录作为当前工作目录,或者没有程序在读写挂载点里的内容。可以先切换到其他目录,再执行重命名操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:37:36