← retour aux snippets

shutil: rmtree sécurisé avec onerror

Supprimer un dossier récursivement en gérant les erreurs (droits, verrous).

python filesystem #shutil#rmtree#cleanup

objectif

Supprimer un dossier récursivement en gérant les erreurs (droits, verrous).

code minimal

import shutil, os, stat, tempfile, pathlib

def on_rm_error(func, path, exc_info):
    try:
        os.chmod(path, stat.S_IWRITE)
        func(path)
    except Exception:
        pass  # journaliser en réel

with tempfile.TemporaryDirectory() as tmp:
    root = pathlib.Path(tmp) / "dir"
    (root / "sub").mkdir(parents=True)
    (root / "sub" / "x.txt").write_text("x", encoding="utf-8")
    shutil.rmtree(root, onerror=on_rm_error, ignore_errors=False)
    print(not root.exists())  # attendu: True

utilisation

import shutil
print(callable(shutil.rmtree))

variante(s) utile(s)

import shutil, tempfile, pathlib
with tempfile.TemporaryDirectory() as tmp:
    p = pathlib.Path(tmp) / "a" / "b"
    p.mkdir(parents=True)
    shutil.rmtree(p.parents[0], ignore_errors=True)
    print(True)

notes

  • onerror permet de modifier les permissions et de réessayer.
  • ignore_errors=True masque les erreurs (à utiliser avec prudence).