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).