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

使用os.rename()触发PermissionError权限拒绝问题求助

问题解决:os.rename() 权限拒绝错误(文件占用)

核心问题

取消采购请求时执行os.rename()重命名文件夹,触发PermissionError: [WinError 5] 访问被拒绝。手动通过资源管理器可正常重命名,账户拥有修改权限,且已尝试删除openpyxl工作簿对象,但问题依旧。

根本原因

del pasta仅删除变量引用,Python垃圾回收不会立即释放文件句柄,导致文件仍被程序占用;Windows系统对文件资源的释放存在延迟,手动删除对象无法保证即时释放。

解决步骤

1. 用上下文管理器(with语句)加载Excel文件

上下文管理器会在代码块结束后自动关闭文件,确保资源即时释放,替代不可靠的手动del操作。

2. 替换重复save操作,改用文件复制

原代码中用同一个工作簿对象保存到两个路径,易引发文件占用问题,改为修改本地文件后复制到目标路径更安全。

3. 强制触发垃圾回收(可选)

重命名前调用gc.collect(),强制回收未使用资源,确保文件句柄完全释放。

4. 检查隐性占用

若之前通过os.startfile()打开过Excel文件,需确保用户已关闭该文件,外部进程占用会导致文件夹无法重命名。

修改后的关键代码片段

import gc
import shutil

# ... 其他原有代码 ...

if event == "Cancelar":
    if sg.popup_ok_cancel("Você tem certeza? Esta ação não poderá ser desfeita.", font=("Helvetica", 12, "bold"), background_color="yellow", title="Confirme") == "OK":
        ind = cycleThrough(caminho[0] + caminho[1], dic=True)
        local_excel = caminho[0] + caminho[1]
        suprimentos_excel = caminho_suprimentos + caminho[1]

        # 使用with语句加载并修改本地Excel,自动关闭文件
        with openpyxl.load_workbook(local_excel) as pasta:
            if "Anexo" in pasta.sheetnames:
                aba = pasta["Anexo"]
                for linha in aba.iter_rows(min_col=ind[1]["Quantidade"][0], max_col=ind[1]["Quantidade"][0], min_row=ind[1]["Quantidade"][1], max_row=ind[1]["Quantidade"][1] + ind[1]["data_ends_at"] - 1):
                    for celula in linha:
                        celula.value = 0
            elif "Formulário" in pasta.sheetnames:
                aba = pasta["Formulário"]
                for linha in aba.iter_rows(min_col=2, max_col=2, min_row=15, max_row=ind[1]["data_ends_at"] + 1):
                    for celula in linha:
                        celula.value = 0
            else:
                sg.popup("A requisição sendo editada não segue o padrão. Zere as quantidades manualmente.")
            pasta.save(local_excel)
        
        # 复制修改后的文件到目标路径,替代原重复save操作
        shutil.copy(local_excel, suprimentos_excel)
        
        # 强制垃圾回收,确保文件资源完全释放
        gc.collect()

        # 执行文件夹重命名
        os.rename(caminho[0], caminho[0][:-1] + " - CANCELADA/")
        os.rename(caminho_suprimentos, caminho_suprimentos[:-1] + " - CANCELADA/")
        sg.popup("Requisição Cancelada")
        break

额外建议

  • 可在重命名前添加短暂延迟(如time.sleep(0.5)),给Windows系统足够时间释放文件资源。
  • 检查路径拼接是否正确,确保caminho[0]和caminho_suprimentos末尾的斜杠处理一致,避免路径错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:27:51