web-dev-qa-db-fra.com

Comment éviter "WindowsError: [Erreur 5] L'accès est refusé"

Il y a le script pour recréer un dossier:

# 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")

Cela fonctionne presque toujours, mais dans certains cas (lors de la création), je reçois

WindowsError: [Error 5] Access is denied: 'C:\\Path\\To\\my_folder'

Qu'est-ce qui pourrait causer cette erreur et comment puis-je l'éviter?

11
Andersson

Les autorisations étaient peut-être le problème, mais j'avais le même problème '[Erreur 5], l'accès est refusé' sur os.rename() et une simple nouvelle tentative a permis de renommer le fichier après quelques tentatives.

for retry in range(100):
    try:
        os.rename(src_name,dest_name)
        break
    except:
        print "rename failed, retrying..."
7
ebmoll

Qu'est-ce qui pourrait causer cette erreur?

Vous n'avez simplement pas accès au dossier que vous écrivez pour le processus en cours d'exécution (python.exe), voire même pour l'utilisateur. À moins que votre utilisateur ne soit un administrateur, il peut exister des répertoires pour lesquels vous ne disposez pas d'autorisations en écriture. 


Comment puis-je l'éviter?

En général, pour éviter une telle exception, on utiliserait un bloc try et except, dans ce cas ce serait un IOError. Par conséquent, si vous voulez simplement ignorer l'accès refusé et continuer avec le script, vous pouvez essayer:

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")

Si vous ne vous attendiez vraiment pas à cette erreur et que cela n'est pas censé se produire, vous devez modifier les autorisations du fichier . Selon vos autorisations d'utilisateur, vous pouvez effectuer différentes étapes. 

  • Utilisateur pouvant exécuter des programmes en tant qu'administrateur: Option A 

    1. Cliquez avec le bouton droit sur cmd.exe.
    2. Cliquez sur Exécuter en tant qu'administrateur.
    3. Accédez à l'emplacement de votre script via cd car il sera ouvert à C:\Windows\system32 sauf si vous avez modifié certains paramètres.
    4. Exécutez votre script > python myscript.py.
  • Utilisateur pouvant exécuter des programmes en tant qu'administrateur: Option B 

    1. Ouvrir l'explorateur de fichiers.
    2. Allez dans le dossier ou les dossiers dans lesquels vous souhaitez écrire.
    3. Faites un clic droit dessus.
    4. Sélectionnez Propriétés.
    5. Dans la fenêtre des propriétés, sélectionnez l'onglet Sécurité.
    6. Cliquez sur Modifier et modifiez-le à votre guise ou pour donner accès à des programmes ou à des utilisateurs.
  • Utilisateur sans privilèges administrateur:

    1. Cela signifie probablement que ce n'est pas votre ordinateur.
    2. Recherchez l’assistance PC si vous êtes chez Uni ou Work ou demandez à votre professeur si vous êtes à l’école. 
    3. Si vous êtes à la maison et que c'est votre ordinateur, cela signifie que vous vous êtes connecté avec un utilisateur non administrateur. Le premier que vous créez est généralement par défaut. Vérifiez les paramètres utilisateur dans le Panneau de configuration, le cas échéant.
    4. A partir de là, le reste est à peu près identique.
6
Mixone

Voir la documentation de RemoveDirectory; .__ "La fonction RemoveDirectory marque un répertoire à supprimer à la fermeture. Par conséquent, le répertoire n'est pas supprimé jusqu'à la fermeture du dernier descripteur du répertoire."

Cela signifie que si quelque chose réussit à créer une poignée dans le répertoire que vous supprimez (entre création et suppression), le répertoire n'est pas réellement supprimé et vous obtenez votre 'Accès refusé',

Pour résoudre ce problème, renommez le répertoire que vous souhaitez supprimer avant de le supprimer.

Alors

while True:
  mkdir('folder 1')
  rmdir('folder 1')

peut échouer, résoudre avec;

while True:
  mkdir('folder 1')
  new_name = str(uuid4())
  rename('folder 1', new_name)
  rmdir(new_name)
5
owillebo

Créez votre fichier de script python. Dans ce cas, vous pouvez le copier dans C:\WINDOWS\system32. Le fichier de script crée un dossier nommé "Smaog"

import os
os.chdir('C:/Program Files')
os.makedirs('Smaog')

Créez un fichier de commandes, dans le dossier de votre choix.

echo off
title Renaming Folder
python sample.py
pause

Enregistrez le fichier de commandes. Pour l'exécuter, cliquez avec le bouton droit de la souris et choisissez Exécuter en tant qu'administrateur.

Vous pouvez toutefois choisir de le faire si vous ne souhaitez pas placer votre script python dans C:\WINDOWS\system32. Dans votre fichier de commandes, indiquez le dossier/répertoire dans lequel réside votre fichier de script python.

echo off
title Renaming Folder
cd c:\Users\Smaog\Desktop
python sample.py
pause

Puis exécutez-le en tant qu'administrateur comme expliqué ci-dessus.

1
AdrianMY

Cela se produit parce que vous ne vérifiez pas si vous disposez des autorisations nécessaires pour ouvrir ce chemin. Vous devez modifier les autorisations sur ces dossiers.

1
wind85

J'ai eu ce problème hier soir après avoir basculé de Py2 à Py3 et j'ai réalisé que je l'installais pour tous les utilisateurs. Cela signifie que vous l’installez dans Program Files répertoire et non au lieu de% AppData% . Généralement, le fait d’exécuter en tant qu’administrateur résout le problème, comme certains d’entre vous l’ont dit plus haut, mais j’utilise VSCode et parfois PyCharm et j’adore y utiliser le terminal. Même si vous essayez d’exécuter ces programmes en tant qu’administrateur, vous aurez beaucoup de difficultés à essayer de vous concentrer sur votre joli code.

Ma solution:  
1) Désinstallation complète (y compris Py Launcher
2) Ensuite, installez avec installation personnalisée avec l'installateur fourni MAIS ... 
3) NE PAS choisissez l’option INSTALLER POUR TOUS LES UTILISATEURS .

Je pense que cela rendra votre journée beaucoup plus facile sans les lignes "[Erreur 5]" à votre commande, car elle a fonctionné pour moi.

0
Mesut Uçar