web-dev-qa-db-fra.com

PermissionError: [WinError 32] Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus

Mon code est pour un script qui regarde un dossier et supprime les images qui sont sous une résolution de 1920x1080. Le problème que j'ai est que lorsque mon code s'exécute;

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)

Je reçois ce message d'erreur:

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'

Juste pour confirmer, Python est le seul programme en cours d'exécution sur mon ordinateur. Quelle est la cause de ce problème et comment le résoudre?

13
user2885647

Votre processus est celui qui a le fichier ouvert (via im toujours existant). Vous devez d'abord le fermer avant de le supprimer.

Je ne sais pas si PIL prend en charge les contextes with, mais si c'est le cas:

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)

Cela vous assurera de supprimer im (et de fermer le fichier) avant d'arriver à os.remove.

Si ce n'est pas le cas, vous voudrez peut-être consulter Pillow, car le développement de PIL est à peu près mort.

11
Mike DeSimone

Je rencontrais le même problème, mais l'erreur était intermittente. Si vous codez votre fichier en ouverture/fermeture correctement et que vous rencontrez toujours cette erreur, assurez-vous que vous ne synchronisez pas les fichiers avec Dropbox, Google Drive, etc. J'ai suspendu Dropbox et je ne vois plus l'erreur.

8
Cleverlike

Il s'agit essentiellement d'une erreur d'autorisation, il vous suffit de fermer le fichier avant de le supprimer. Après avoir obtenu les informations sur la taille de l'image, fermez l'image avec

im.close()
1
Ayesha