【问题标题】:PermissionError: [WinError 32] The process cannot access the file because it is being used by another processPermissionError: [WinError 32] 该进程无法访问该文件,因为它正被另一个进程使用
【发布时间】: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 是我计算机上唯一运行的程序。是什么导致了这个问题,我该如何解决?

【问题讨论】:

    标签: python python-3.x file-handling


    【解决方案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()
          

          【讨论】:

            猜你喜欢
            • 2015-11-13
            • 2017-06-02
            • 2021-09-21
            • 2019-11-26
            • 1970-01-01
            • 2020-10-31
            • 2018-10-28
            • 2022-11-14
            • 2021-07-13
            相关资源
            最近更新 更多