python - 'Processen kan ikke få adgang til filen, fordi den bruges af en anden proces', når du sletter billedet

Indlæg af Hanne Mølgaard Plasc

Problem



Så jeg har nogle kode, hvor jeg går gennem en flok billeder for at se om de har den rigtige størrelse eller er korrupt. Det gør jeg med følgende kode:


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


Dette er selvfølgelig inden for en løkke (som n indikerer).


Så det første forsøg/undtagen kode det forsøger at åbne en fil, og hvis det kan det går videre. Hvis det ikke er muligt, er det normalt korrupt, og jeg beder om at slette den pågældende fil. Så langt så godt. Jeg beder derefter om at kontrollere, om billedet har den rigtige størrelse, og hvis ikke, skal du slette det. Men det er stort set hvor det går galt hver gang, og jeg ender med fejlen som angivet i titlen.


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


Og det er lidt tilfældigt. Nogle gange får jeg det inden for de første 10-20 billeder, og nogle gange sker det på billede 300 eller noget. Min idé er, at billedet skal være åbent og derfor ikke kan slettes. Men som du kan se, har jeg brugt funktionen img.close () lige før, så dette bør ikke ske imo. Så er der alligevel at rette op på dette? Skal jeg sætte en tidsforsinkelse, så det faktisk har tid til at lukke billedet, før du forsøger at slette det, eller ...?

Bedste reference


Min vilde gætte, at den har noget at gøre med Windows-filsystemet. Hvis du tilføjer en forsøgsløkke med en kort søvn, skal du løse dette problem.


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

Andre referencer 1


Du kan prøve at finde ud af, hvilken proces filen har åbnet ved at fange undtagelsen, indtaste debuggeren og derefter bruge Process Explorer:


try:
    ...
except WindowsError:
    import pdb; pdb.set\_trace()


Process Explorer: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
(Ctrl-F, find håndtag eller dll) [5]