Удаление каталога в Python
shutil.rmtree
не будет удалять файлы только для чтения в Windows. Есть ли эквивалент python "rm -rf"? Почему, почему это такая боль?
Ответы
Ответ 1
shutil.rmtree
может принимать функцию обработки ошибок, которая будет вызываться, когда возникает проблема с удалением файла. Вы можете использовать это для принудительного удаления проблемных файлов.
Вдохновленный http://mail.python.org/pipermail/tutor/2006-June/047551.html и http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html
import os
import stat
import shutil
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(top, onerror=remove_readonly)
(я не тестировал этот фрагмент, но этого должно быть достаточно, чтобы вы начали)
Ответ 2
Если вы импортируете win32api из PyWin32, вы можете использовать:
win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)
Чтобы файлы перестали быть доступными только для чтения.
Ответ 3
Другой способ - определить rmtree для Windows как
rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
Ответ 4
На сайте ActiveState есть комментарий:
У shutil.rmtree есть свои недостатки. Хотя верно, что во многих случаях вы можете использовать shutil.rmtree(), есть случаи, когда он не работает. Например, файлы, помеченные только для чтения под Windows, не могут быть удалены с помощью shutil.rmtree().
Импортируя модули win32api и win32con из PyWin32 и добавляя к функции rmgeneric() функцию win32api.SetFileAttributes(путь, win32con.FILE_ATTRIBUTE_NORMAL), это препятствие можно преодолеть. Я использовал этот подход для исправления горячей резервной копии .py script Subversion 1.4, поэтому он будет работать под Windows. Спасибо за рецепт.
Я не использую Windows, поэтому не могу проверить, работает это или нет.
Ответ 5
Вот вариант, который опубликовал Стив, он использует один и тот же базовый механизм, и этот тест проверяется: -)
Какой пользователь запускает скрипты python, как в Windows?
Ответ 6
Предположительно, это будет исправлено с выпуском Python 3.5 (в настоящее время - июнь 2015 года - все еще находится в разработке) в смысле указания в документации.
Здесь вы можете найти bugreport здесь. И this является соответствующим набором изменений.
См. недавно добавленный пример из Документов Python 3.5:
import os, stat
import shutil
def remove_readonly(func, path, _):
"Clear the readonly bit and reattempt the removal"
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(directory, onerror=remove_readonly)