"进程无法访问该文件,因为它正被另一个进程使用"删除图片时

时间:2017-08-01 20:13:15

标签: python windows image

所以我有一些代码,我会通过一堆图像来查看它们是否具有正确的大小,或者是否已损坏。我使用以下代码执行此操作:

import PIL
from PIL import Image

    try:
        img = Image.open("{}/{}.jpg".format(img_dir_path, n))
    except:
        os.remove("{}/{}.jpg".format(img_dir_path, n))
        continue

    if img.size[0] < 600:
        img.close()
        os.remove("{}/{}.jpg".format(img_dir_path, n))
    elif img.size[0] > 600:
        img.close()
        break

这当然在一个循环内(如n所示)。

所以第一次尝试/除了代码它试图打开一个文件,如果它可以继续前进。如果它不能它通常是腐败的,我要求它删除该文件。到现在为止还挺好。然后我要求它检查图像是否具有正确的尺寸,如果没有,则删除它。但是,这几乎是每次出错的地方,最终我会在标题中发布错误。

WindowsError: [Error 32] The process cannot access the file because it is being used by another process:

它有点随意。有时我会在前10-20张图像中得到它,有时它会发生在图像300或其他东西上。我的想法是图像必须打开,因此无法删除。但是你可以看到我之前使用过img.close()函数,所以这不应该发生。那么有没有解决这个问题?我是否需要延迟时间,以便在尝试删除图像之前实际有时间关闭图像,或者......?

2 个答案:

答案 0 :(得分:1)

我猜测它与Windows文件系统有关。添加具有短睡眠的重试循环应解决此问题。

def remove_file(path, retries=3, sleep=0.1):
    for i in range(retries):
        try:
            os.remove(path)
        except WindowsError:
            time.sleep(sleep)
        else:
            break

答案 1 :(得分:0)

您可以通过捕获异常,进入调试器,然后使用Processs Explorer来尝试找到打开文件的进程:

try:
    ...
except WindowsError:
    import pdb; pdb.set_trace()

Process Explorer:https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer (Ctrl-F,查找句柄或dll)