Контекст: Я использую shutil.rmtree
(delDir, ignore_errors = False, onerror = readOnlyErrorHandler)
, чтобы удалить дерево каталогов, содержащее файлы только для чтения:
Раздражение: PyLint (внутри кода VS) помечает команду raise
внутри моей функции readOnlyErrorHandler
как
- «Оператор поднятия не находится в предложении исключений» от pylint (misplaced-bare-повышение) .
Вопрос: Есть ли способ обойти это предупреждение, не отключая линтинг для всего файла?
def readOnlyErrorHandler(func, path, exc_info):
import errno
if func in (os.rmdir, os.unlink, os.remove) and exc_info[1].errno == errno.EACCES:
print (f"Retry '{func.__name__}' after chmod 0o777 on '{path}'")
os.chmod(path, 0o777)
func(path)
else:
# marked as 'The raise statement is not inside an except clause'
# by pylint(misplaced-bare-raise)
raise # purpose: rethrow the other errors that brought me here
Система: Windows, Python3.6.3
Тест с:
from stat import S_IREAD, S_IRGRP, S_IROTH
import os
import shutil
path = "./some/path/to/files/"
# create read only files:
os.makedirs(path, exist_ok=True)
for fn in ["one.txt","two.txt"]:
filename = os.path.join(path, fn)
with open(filename, "w") as f:
f.write("read only")
os.chmod(filename, S_IREAD|S_IRGRP|S_IROTH)
# try to delete files
# fails: shutil.rmtree(path)
# works
shutil.rmtree(path, ignore_errors=False, onerror=readOnlyErrorHandler)