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

Python运行触发WinError 32进程无法访问被占用文件问题求助

问题根因
  • Pillow的Image.open默认采用懒加载机制,仅在实际读取像素时才加载文件内容,哪怕使用with上下文管理器,BMP这类格式转换为numpy数组时仍可能残留文件句柄引用,导致后续删除目录时触发占用报错
  • Windows文件系统存在缓存锁机制,即便进程主动释放了文件句柄,也可能存在数毫秒的延迟,立刻执行删除操作就会报错
  • 现有代码未过滤os.listdir返回的目录项,若解压目录存在子文件夹,调用Image.open打开目录也会引发异常
  • 代码中使用了np.array但未导入numpy依赖,也会引发运行异常
修复方案

按照以下步骤调整代码即可解决问题:

  1. 补全numpy依赖导入
  2. 读取图像时主动调用img.load()强制将像素数据加载到内存,彻底断开与源文件的关联
  3. 遍历目录时增加文件校验,仅处理合法的图像文件
  4. 给shutil.rmtree增加重试逻辑,适配Windows文件系统的锁延迟
  5. 异常捕获规则中加入PermissionError,覆盖文件占用类报错

修复后完整代码

import opendatasets as od
import urllib
import zipfile
import os
import shutil
from PIL import Image
import time
import numpy as np

try:
    download = od.download('http://www.mae.cuhk.edu.hk/~cvl/iris_database/iris_database.zip', '../data/')
        
    path_extract = '../data/iris_database/'
    with zipfile.ZipFile('../data/iris_database.zip', 'r') as zip_ref:
        zip_ref.extractall(path_extract)
        
    os.remove(path_extract + 'readme.txt')

    filenames = os.listdir(path_extract)
    scans = []
    for f in filenames:
        file_path = os.path.join(path_extract, f)
        # 跳过目录,仅处理文件
        if not os.path.isfile(file_path):
            continue
        # 仅处理合法图像格式
        if not f.lower().endswith(('.bmp', '.png', '.jpg', '.jpeg')):
            continue
        with Image.open(file_path) as img:
            # 强制加载像素到内存,释放文件句柄
            img.load()
            matrix = np.array(img)
            scans.append(matrix)
        
    print("before RMTREE")
    # Windows删除目录重试逻辑,兼容文件锁延迟
    retry_cnt = 3
    while retry_cnt > 0:
        try:
            shutil.rmtree(path_extract)
            break
        except PermissionError:
            retry_cnt -= 1
            time.sleep(0.5)
    if retry_cnt == 0:
        raise RuntimeError("多次尝试删除目录失败,文件仍被占用")
        
    print("before OS.REMOVE")
    os.remove(path_extract[:-1] + '.zip')

except (urllib.error.URLError, IOError, RuntimeError, PermissionError) as e:
    print(e)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 23:03:03