Как избежать "WindowsError: [Ошибка 5] Доступ запрещен"
Там есть скрипт для повторного создания папки:
# Remove folder (if exists) with all files
if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")):
shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True)
# Create new folder
os.mkdir(os.path.realpath('..') + "\\my_folder")
Это работает почти всегда, но в некоторых случаях (на этапе создания) я получаю
WindowsError: [Error 5] Access is denied: 'C:\\Path\\To\\my_folder'
Что может вызвать эту ошибку и как ее избежать?
8 ответов
Смотрите документацию RemoveDirectory; "Функция RemoveDirectory помечает каталог для удаления при закрытии. Поэтому каталог не удаляется до тех пор, пока не будет закрыт последний дескриптор каталога".
Это означает, что если что-то удается создать дескриптор удаляемого каталога (между созданием и удалением), то каталог фактически не удаляется, и вы получаете "Отказ в доступе",
Чтобы решить эту проблему, переименуйте каталог, который вы хотите удалить, прежде чем удалять его.
Так
while True:
mkdir('folder 1')
rmdir('folder 1')
может потерпеть неудачу, решить с;
while True:
mkdir('folder 1')
new_name = str(uuid4())
rename('folder 1', new_name)
rmdir(new_name)
Возможно, проблема связана с разрешениями, но у меня возникла та же проблема "[Ошибка 5] Доступ запрещен" на os.rename()
и простой цикл повторных попыток смог переименовать файл после нескольких попыток.
for retry in range(100):
try:
os.rename(src_name,dest_name)
break
except:
print "rename failed, retrying..."
Что может вызвать эту ошибку?
У вас просто нет доступа к папке, в которую вы пишете, для процесса, который выполняется в данный момент (python.exe), или, возможно, даже для пользователя. Если ваш пользователь не является администратором, могут существовать каталоги, для которых у вас нет прав на запись.
Как я могу избежать этого?
В общем, чтобы избежать такого исключения, можно использовать try
а также except
блок, в этом случае это будет IOError
, Поэтому, если вы просто хотите пропустить доступ запрещен и продолжить работу со сценарием, вы можете попробовать:
try:
# Remove folder (if exists) with all files
if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")):
shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True)
# Create new folder
os.mkdir(os.path.realpath('..') + "\\my_folder")
except IOError:
print("Error upon either deleting or creating the directory or files.")
else:
print("Actions if file access was succesfull")
finally:
print("This will be executed even if an exception of IOError was encountered")
Если вы действительно не ожидали этой ошибки, и это не должно произойти, вы должны изменить разрешения для файла. В зависимости от ваших пользовательских прав, вы можете предпринять различные шаги.
Пользователь, который может выполнять программы от имени администратора: вариант A
- Щелкните правой кнопкой мыши на
cmd.exe
, - Нажмите " Запуск от имени администратора".
- Перейдите к местоположению вашего скрипта через
cd
так как он будет открыт вC:\Windows\system32
если у вас нет редактирования определенных параметров. - Запустите ваш скрипт
> python myscript.py
,
- Щелкните правой кнопкой мыши на
Пользователь, который может выполнять программы от имени администратора: опция B
- Открыть файловый менеджер.
- Перейдите в папку или папки, в которые вы хотите написать.
- Щелкните правой кнопкой мыши по нему.
- Выберите Свойства.
- В окне свойств выберите вкладку безопасности.
- Нажмите "Редактировать" и отредактируйте его, если хотите или хотите предоставить доступ к программам или пользователям.
Пользователь без прав администратора:
- Это, вероятно, означает, что это не ваш компьютер.
- Обратитесь в службу поддержки ПК, если вы работаете в Uni или Work, или спросите своего учителя, если вы в школе.
- Если вы находитесь дома, и это ваш компьютер, это означает, что вы вошли в систему с правами не администратора. Первый, который вы обычно создаете, по умолчанию. Проверьте настройки пользователя на панели управления, если это так.
- Оттуда остальное в значительной степени то же самое потом.
Для меня это сработало так:
while os.path.isdir (your_path):
shutil.rmtree (your_path, ignore_errors=True)
os.makedirs (your_path)
Создайте свой файл скрипта Python. В этом случае вы можете скопировать его в C:\WINDOWS\system32. Файл сценария создает папку с именем "Smaog"
import os
os.chdir('C:/Program Files')
os.makedirs('Smaog')
Создайте пакетный файл в любой папке.
echo off
title Renaming Folder
python sample.py
pause
Сохраните командный файл. Чтобы запустить его, щелкните правой кнопкой мыши и выберите "Запуск от имени администратора".
Хотя вы можете сделать это вместо этого, если вы не хотите помещать свой скрипт Python в C:\WINDOWS\system32. В вашем пакетном файле укажите папку / каталог, в котором находится ваш файл скрипта Python.
echo off
title Renaming Folder
cd c:\Users\Smaog\Desktop
python sample.py
pause
Затем запустите его от имени администратора, как описано выше.
os.chmod() — это один из подходов в python, с помощью которого мы можем изменить режим пути на числовой режим, аналогичныйchmod 777
в линукс.
Синтаксис: os.chmod(filepath, mode)
import os
import stat
# In Windows
os.chmod(file_name, stat.S_IRWXU|stat.S_IRWXG|stat.S_IRWXO)
# In Linux
os.chmod(file_name, 0o555)
Это происходит потому, что вы не проверяете, есть ли у вас разрешения на открытие этого пути. Вам необходимо изменить разрешения для этих папок.
У меня была эта проблема прошлой ночью после переключения Py2 на Py3 и я понял, что устанавливаю ее для всех пользователей. Это означает, что вы устанавливаете его в каталог Program Files, а не в % AppData%. В основном работа в качестве администратора решает проблему, как некоторые из вас сказали выше, но я использую VSCode, а иногда PyCharm и люблю использовать в них терминал. Даже если вы попытаетесь запустить эти программы от имени администратора, у вас будет много неприятных моментов, когда вы будете пытаться сосредоточиться на своем прекрасном коде.
Мое решение:
1) Полная деинсталляция (включая Py Launcher)
2) Затем установите с пользовательской установкой с помощью предоставленного установщика НО...
3) НЕ выбирайте опцию УСТАНОВИТЬ ДЛЯ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ.
Я думаю, что это сделает ваш день намного легче без каких-либо строк "[Ошибка 5]" в командной строке, как это сработало для меня.