PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用

Posted

技术标签:

【中文标题】PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用【英文标题】:PermissionError: [WinError 32] The process cannot access the file because it is being used by another process 【发布时间】:2015-01-28 16:41:04 【问题描述】:

我的代码用于查看文件夹并删除分辨率为 1920x1080 的图像的脚本。我遇到的问题是当我的代码运行时;

import os
from PIL import Image

while True:    
    img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
    for filename in os.listdir(img_dir):
        filepath = os.path.join(img_dir, filename)
        im = Image.open(filepath)
        x, y = im.size
        totalsize = x*y
        if totalsize < 2073600:
            os.remove(filepath)

我收到此错误消息:

Traceback (most recent call last):
  File "C:\Users\Harold\Desktop\imagefilter.py", line 12, in <module>
    os.remove(filepath)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\Harold\\Google Drive\\wallpapers\\Car - ABT Audi RS6-R [OS] [1600x1060].jpg'

确认一下,Python 是我计算机上唯一运行的程序。是什么导致了这个问题,我该如何解决?

【问题讨论】:

【参考方案1】:

您的进程是打开文件的进程(通过im 仍然存在)。删除前需要先关闭。

我不知道 PIL 是否支持 with 上下文,但如果支持:

import os
from PIL import Image

while True:    
    img_dir = r"C:\Users\Harold\Google Drive\wallpapers"
    for filename in os.listdir(img_dir):
        filepath = os.path.join(img_dir, filename)
        with Image.open(filepath) as im:
            x, y = im.size
        totalsize = x*y
        if totalsize < 2073600:
            os.remove(filepath)

这将确保在您到达 os.remove 之前删除 im(并关闭文件)。

如果没有,您可能想查看 Pillow,因为 PIL 开发几乎已死。

【讨论】:

【参考方案2】:

我遇到了同样的问题,但错误是间歇性的。如果您正确编码文件打开/关闭但仍然遇到此错误,请确保您没有将文件与 Dropbox、Google Drive 等同步。我暂停了 Dropbox,我不再看到错误。

【讨论】:

【参考方案3】:

这基本上是权限错误,您只需要在删除之前关闭文件即可。获取图像大小信息后,关闭图像

im.close()

【讨论】:

这并不适用于所有情况。例如,如果我使用代码file_path = os.path.join(os.path.expanduser("~/Desktop"),'my_file.zip') 构造一个路径,然后尝试file_path.close() 我得到 AttributeError: 'str' object has no attribute 'close'。 @AdrianKeister,那是因为您为 file_path 分配了一个“str”对象,而不是一个“file”对象。对于经验丰富的 Python 程序员来说,这是一个明显的错误。这个答案是关闭文件的一种完全可以接受的方式。但是,它不像使用接受的答案中提到的 with 上下文那样惯用。【参考方案4】:

我也遇到了这个问题,在 windows [WinError 32]

通过改变解决:

try:
    f = urllib.request.urlopen(url)
    _, fname = tempfile.mkstemp()
    with open(fname, 'wb') as ff:
        ff.write(f.read())
    img = imread(fname)
    os.remove(fname)
    return img

进入:

try:
    f = urllib.request.urlopen(url)
    fd, fname = tempfile.mkstemp()
    with open(fname, 'wb') as ff:
        ff.write(f.read())
    img = imread(fname)
    os.close(fd)
    os.remove(fname)
    return img

在这里找到:https://no.coredump.biz/questions/45042466/permissionerror-winerror-32-when-trying-to-delete-a-temporary-image

【讨论】:

【参考方案5】:

希望这会有所帮助。

import os

def close():

    try:
        os.system('TASKKILL /F /IM excel.exe')

    except Exception:
        print("KU")

close()

【讨论】:

以上是关于PermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章

权限报错 PermissionError

PermissionError:[Errno 13] 权限被拒绝:

当 conda install django, PermissionError(13, 'Permission denied')

PermissionError: [Errno 13] 权限被拒绝

NameError:未定义全局名称“PermissionError”(python 2.x)

PermissionError: [Errno 13] Permission denied: ‘name.pdf‘