Shutil.rmtree для удаления файлов readonly

Я хочу использовать shutil.rmtree в Python для удаления каталога. В рассматриваемой директории находится каталог управления .git, который git отмечает как доступный только для чтения и скрытый.

Флаг только для чтения вызывает отказ rmtree. В Powershell я бы сделал "del -force", чтобы принудительно удалить флаг только для чтения. Есть ли эквивалент в Python? Я бы предпочел не ходить по всему дереву дважды, но аргумент onerror для rmtree, похоже, не повторяет операцию, поэтому я не могу использовать

def set_rw(operation, name, exc):
    os.chmod(name, stat.S_IWRITE)

shutil.rmtree('path', onerror=set_rw)

Ответы

Ответ 1

После более подробного исследования будет работать следующее:

def del_rw(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)
shutil.rmtree(path, onerror=del_rw)

Другими словами, фактически удалите файл в функции onerror. (Возможно, вам нужно будет проверить каталог в обработчике onerror и использовать rmdir в этом случае - мне это не нужно, но это может быть только что-то конкретное в моей проблеме.