shutil.rmtree терпит неудачу на Windows с 'Доступ запрещен'
в Python, при запуске shutil.rmtree
над папкой, содержащей файл только для чтения, выводится следующее исключение:
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 216, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:Python26libshutil.py", line 221, in rmtree
onerror(os.remove, fullname, sys.exc_info())
File "C:Python26libshutil.py", line 219, in rmtree
os.remove(fullname)
WindowsError: [Error 5] Access is denied: 'buildtcltcl8.5msgsaf.msg'
глядя в диалоговом окне свойств файла я заметил, что af.msg
файл доступен только для чтения.
Итак, вопрос: Что такое простой обходной путь / исправление, чтобы обойти эту проблему-учитывая, что мое намерение состоит в том, чтобы сделать эквивалент rm -rf build/
но на Windows? (без использования сторонних инструментов, таких как unxutils или cygwin-поскольку этот код предназначен для запуска на голой установке Windows с установленным Python 2.6 w / PyWin32)
5 ответов:
проверьте этот вопрос:
какой пользователь выполняет скрипты python в windows?
по-видимому, ответ заключается в том, чтобы изменить файл/папку, чтобы она не была доступна только для чтения, а затем удалить ее.
здесь
onerror()
обработчик отpathutils.py
упоминается @Sridhar Ratnakumar в комментариях:def onerror(func, path, exc_info): """ Error handler for ``shutil.rmtree``. If the error is due to an access error (read only file) it attempts to add write permission and then retries. If the error is for another reason it re-raises the error. Usage : ``shutil.rmtree(path, onerror=onerror)`` """ import stat if not os.access(path, os.W_OK): # Is the error an access error ? os.chmod(path, stat.S_IWUSR) func(path) else: raise
Я бы сказал, реализовать свой собственный rmtree с ОС.гуляй обеспечивает доступ с помощью ОС.чмод на каждый файл, прежде чем пытаться удалить его.
что-то вроде этого (непроверенных):
import os import stat def rmtree(top): for root, dirs, files in os.walk(top, topdown=False): for name in files: filename = os.path.join(root, name) os.chmod(filename, stat.S_IWUSR) os.remove(filename) for name in dirs: os.rmdir(os.path.join(root, name)) os.rmdir(top)
ну, отмеченное решение не работает для меня... это вместо этого:
os.system('rmdir /S /Q "{}"'.format(directory))
shutil.rmtree(path,ignore_errors=False,onerror=errorRemoveReadonly) def errorRemoveReadonly(func, path, exc): excvalue = exc[1] if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: # change the file to be readable,writable,executable: 0777 os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) # retry func(path) else: raiseenter code here
если установлено значение ignore_errors, ошибки игнорируются; в противном случае, если onerror устанавливается, вызывается для обработки ошибки с аргументами (func, path, exc_info), где func-это ОС.listdir, os.удалить, или ОС.команда rmdir; path-это аргумент той функции, которая вызвала ее сбой; и exc_info-это кортеж, возвращаемый sys.exc_info (). Если параметр ignore_errors значение false и onerror-нет, возникает исключение.введите код здесь
простой обходной путь использует
subprocess.call
from subprocess import call call("rm -rf build/", shell=True)
для того, чтобы выполнить все, что вы хотите.