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

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

    1. Открыть файловый менеджер.
    2. Перейдите в папку или папки, в которые вы хотите написать.
    3. Щелкните правой кнопкой мыши по нему.
    4. Выберите Свойства.
    5. В окне свойств выберите вкладку безопасности.
    6. Нажмите "Редактировать" и отредактируйте его, если хотите или хотите предоставить доступ к программам или пользователям.
  • Пользователь без прав администратора:

    1. Это, вероятно, означает, что это не ваш компьютер.
    2. Обратитесь в службу поддержки ПК, если вы работаете в Uni или Work, или спросите своего учителя, если вы в школе.
    3. Если вы находитесь дома, и это ваш компьютер, это означает, что вы вошли в систему с правами не администратора. Первый, который вы обычно создаете, по умолчанию. Проверьте настройки пользователя на панели управления, если это так.
    4. Оттуда остальное в значительной степени то же самое потом.

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

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]" в командной строке, как это сработало для меня.

Другие вопросы по тегам