Я пытаюсь использовать модуль tarfile Python для извлечения архива tar.gz.
Я бы хотел, чтобы при извлечении перезаписывались любые целевые файлы, если они уже существуют - это нормальное поведение tarfile.
Однако я попадаю в ловушку того, что некоторые файлы имеют защиту от записи (например, chmod 550).
Операция tarfile.extractall()
фактически не выполняется:
IOError: [Errno 13] Permission denied '/foo/bar/file'
Если я попытаюсь удалить файлы из обычной командной строки, я смогу это сделать, мне просто нужно ответить на приглашение:
$ rm <filename>
rm: <filename>: override protection 550 (yes/no)? yes
Обычная утилита tar GNU также легко обрабатывает эти файлы - она просто перезаписывает их при извлечении.
Мой пользователь является владельцем файлов, поэтому нетрудно рекурсивно изменить chmod целевые файлы перед запуском tarfile.extractall. Или я могу использовать shutil.rmtree, чтобы заранее сбить цель, это обходной путь, который я использую сейчас ... Однако это кажется немного хакерским.
Есть ли более питонический способ обработки перезаписи файлов, доступных только для чтения, в tarfile, с использованием исключений или чего-то подобного?