Как избежать «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'

Что может вызвать эту ошибку и как ее избежать?

 Netwave15 июн. 2016 г., 10:58

Ответы на вопрос(7)

Создайте свой файл скрипта 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

Затем запустите его от имени администратора, как описано выше.

У меня была эта проблема прошлой ночью после переключения Py2 на Py3 и я понял, что устанавливаю ее для всех пользователей. Это означает, что вы устанавливаете его вПрограммные файлы каталог не вместо%Данные приложения%, Работа в качестве администратора решает проблему, как некоторые из вас сказали выше, но я использую VSCode, а иногда PyCharm и люблю использовать в них терминал. Даже если вы попытаетесь запустить эти программы от имени администратора, у вас будет много неприятных моментов, когда вы будете пытаться сосредоточиться на своем прекрасном коде.

Мое решение:
1) полное удаление (в том числеPy Launcher)
2) Затем установите сВыборочная установка с предоставленным инсталлятором НО ...
3)НЕ ДЕЛАЙТЕ выбратьУСТАНОВИТЬ ДЛЯ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ вариант.

Я думаю, что это сделает ваш день намного легче без каких-либо строк «[Ошибка 5]» в командной строке, как это сработало для меня.

Смотрите документацию 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)
 Andersson15 авг. 2017 г., 10:05
Проблема больше не актуальна, поэтому я не могу ее проверить. Но я совершенно уверен, что это должно работать
 Emma26 янв. 2018 г., 21:25
Я могу подтвердить, что этот трюк сработал. Интересно, что после вызова rmdir я использовал os.path.exists (), чтобы проверить, была ли папка успешно удалена, прежде чем пытаться воссоздать ее. Несмотря на то, что os.path.exists (путь) возвращал значение False, я по-прежнему получал ошибку «Доступ запрещен» при запуске os.mkdir (путь).

проблема связана с разрешениями, но у меня возникла та же проблема «[Ошибка 5] Доступ запрещен» наos.rename() и простой цикл повторных попыток смог переименовать файл после нескольких попыток.

for retry in range(100):
    try:
        os.rename(src_name,dest_name)
        break
    except:
        print "rename failed, retrying..."
 CivFan19 сент. 2018 г., 01:21
Это хороший совет. Предположительно, если это работает в подавляющем большинстве случаев, тогда это временная проблема, и просто повторная попытка - правильный выбор, прежде чем потерпеть неудачу.
 DaveSawyer05 дек. 2018 г., 00:36
Как написано, вы не можете сказать, если вы не смогли переименовать. Одно из исправлений (и для правильного отслеживания рейза) состоит вexcept: if retry < 99: print('rename failed, retrying...' else: raise

Что может вызвать эту ошибку?

У вас просто нет доступа к папке, в которую вы пишете, для процесса, который выполняется в данный момент (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")

Если вы действительно не ожидали этой ошибки, и это не должно произойти, вы должны изменить разрешения для файла. В зависимости от ваших пользовательских прав, вы можете предпринять различные шаги.

Пользователь, который может выполнять программы от имени администратора: Вариант А

Щелкните правой кнопкой мыши наcmd.exe.Нажмите наЗапустить от имени администратора.Перейдите к местоположению вашего скрипта черезcd так как он будет открыт вC:\Windows\system32 если у вас нет редактирования определенных параметров.Запустите ваш скрипт> python myscript.py.

Пользователь, который может выполнять программы от имени администратора: Вариант Б

Открыть файловый менеджер.Перейдите в папку или папки, в которые вы хотите написать.Щелкните правой кнопкой мыши по нему.Выберите Свойства.В окне свойств выберите вкладку безопасности.Нажмите «Изменить» и отредактируйте его по своему желанию или для предоставления доступа к программам или пользователям.

Пользователь без прав администратора:

Это, вероятно, означает, что это не ваш компьютер.Обратитесь в службу поддержки ПК, если вы работаете в Uni или Work, или спросите своего учителя, если вы в школе.Если вы находитесь дома, и это ваш компьютер, это означает, что вы вошли в систему с правами не администратора. Первый, который вы создаете, обычно по умолчанию. Проверьте настройки пользователя на панели управления, если это так.Оттуда остальное в значительной степени то же самое потом.
 Oussama Boussif05 сент. 2017 г., 22:14
Я попробовал все на этом ответе, но ничего не помогло, это действительно беспокоит меня.
 Emma26 янв. 2018 г., 20:50
Я сталкиваюсь с той же проблемой, и это определенно не проблема разрешений. Если я оставлю несколько секунд сна между rmtree и mkdir, он будет работать каждый раз, но если я сделаю mkdir немедленно, он каждый раз будет выходить из строя.
 Mixone27 янв. 2018 г., 22:56
Ух ты, этот вопрос старый, ха-ха, дело в том, что первоначальный аскер так сильно изменил вопрос, мой ответ в основном просто хорош для обзора проблем с разрешениями. Первоначальный вопрос заключался в том, что невозможно было получить доступ к папке, не говоря об исключениях, но они на самом деле хотели получить ответ, если не было выдано никаких исключений, так что вы, вероятно, правы

Это происходит потому, что вы не проверяете, есть ли у вас разрешения на открытие этого пути. Вам необходимо изменить разрешения для этих папок.

Для меня это сработало так:

while os.path.isdir (your_path):
    shutil.rmtree (your_path, ignore_errors=True)
os.makedirs (your_path)

Ваш ответ на вопрос