Python 图像未正确关闭?

Python 图像未正确关闭?,python,django,django-models,python-imaging-library,Python,Django,Django Models,Python Imaging Library,我正在覆盖“保存模型”功能,以便在保存前调整配置文件图片的大小。我的函数如下所示: def save(self, *args, **kwargs): super(Profile, self).save(*args, **kwargs) if self.avatar: with Image.open(self.avatar) as image: image_path = self.avatar.path image_

我正在覆盖“保存模型”功能,以便在保存前调整配置文件图片的大小。我的函数如下所示:

def save(self, *args, **kwargs):
    super(Profile, self).save(*args, **kwargs)

    if self.avatar:
        with Image.open(self.avatar) as image:
            image_path = self.avatar.path
            image_name = self.avatar.path[:-4]
            image_ext = self.avatar.path[-4:]
            resize_images(image, image_path, image_name, image_ext)
            image.close()
def resize_images(image, image_path, image_name, image_ext):
    image = image.resize((400, 400), Image.ANTIALIAS)
    image.save(image_path, optimize=True, quality=95)

    medium_image = image.resize((250, 250), Image.ANTIALIAS)
    image.close()

    medium_path = image_name + "_medium" + image_ext
    medium_image.save(medium_path, optimize=True, quality=95)

    small_image = medium_image.resize((100, 100), Image.ANTIALIAS)
    small_path = image_name + "_small" + image_ext
    small_image.save(small_path, optimize=True, quality=95)
    medium_image.close()

    mini_image = small_image.resize((50, 50), Image.ANTIALIAS)
    mini_path = image_name + "_mini" + image_ext
    mini_image.save(mini_path, optimize=True, quality=95)

    small_image.close()
    mini_image.close()
我的
resize_images
函数如下所示:

def save(self, *args, **kwargs):
    super(Profile, self).save(*args, **kwargs)

    if self.avatar:
        with Image.open(self.avatar) as image:
            image_path = self.avatar.path
            image_name = self.avatar.path[:-4]
            image_ext = self.avatar.path[-4:]
            resize_images(image, image_path, image_name, image_ext)
            image.close()
def resize_images(image, image_path, image_name, image_ext):
    image = image.resize((400, 400), Image.ANTIALIAS)
    image.save(image_path, optimize=True, quality=95)

    medium_image = image.resize((250, 250), Image.ANTIALIAS)
    image.close()

    medium_path = image_name + "_medium" + image_ext
    medium_image.save(medium_path, optimize=True, quality=95)

    small_image = medium_image.resize((100, 100), Image.ANTIALIAS)
    small_path = image_name + "_small" + image_ext
    small_image.save(small_path, optimize=True, quality=95)
    medium_image.close()

    mini_image = small_image.resize((50, 50), Image.ANTIALIAS)
    mini_path = image_name + "_mini" + image_ext
    mini_image.save(mini_path, optimize=True, quality=95)

    small_image.close()
    mini_image.close()
当我保存一个图像时,它工作得很好,但是,当我在几秒钟后尝试上载另一个图像时,我遇到以下错误:

PermissionError:[WinError 32]进程无法访问该文件 因为它正被另一个进程使用: 'C:\Users\xx\xx\xx\media\Users\179\avatars \179312.jpg'

罪魁祸首是
resize_images
函数,因为当我将其注释掉时,每隔几秒钟重新加载一次后,这个错误就会消失。然而,我不明白我做错了什么。我正在关闭图像,但为什么它还在抱怨

编辑 每当我在
resize\u images
功能中保存图像时,似乎都是真正的罪魁祸首

我也有这个存储功能:

avatar  = models.ImageField(storage=OverwriteStorage(), upload_to=create_user_image_path, validators=[validate_avatar],
                           default="default/avatars/default.jpg")

class OverwriteStorage(FileSystemStorage):

    def get_available_name(self, name, *args, **kwargs):

        try:
            file_path = os.path.dirname(name)
            shutil.rmtree(os.path.join(settings.MEDIA_ROOT, file_path))
        except FileNotFoundError:
            pass

        return name

尝试将
None
指定为用于文件上载的变量的值,上载文件后。@VasuDeo.S哪个变量确切?上载图像变量时使用的变量?作为旁注:最好使用splitext获取文件名和扩展名:尝试指定
None
作为上载文件时使用的变量的值,上载文件后。@VasuDeo.S哪个变量确切?用于上载图像变量的变量?作为旁注:最好使用splitext获取文件名和扩展名: