Python中重命名文件触发‘设备或资源忙’错误,求解决方案
嘿,我来帮你搞定这个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

