IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

PermissionError: [WinError 5] Accès refusé [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut PermissionError: [WinError 5] Accès refusé
    Bonjour à tous,

    Je suis en train de m'entrainer à Python et j'ai un soucis sur un code que j'ai fait qui consiste à supprimer le contenu du dossier (fichier et sous dossiers).
    C'est un dossier que j'ai crée pour le test.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import glob, os
     
    # effacer tous les fichiers du dossier test
     
    for filename in glob.glob("C:\\MON REPERTOIRE"):
        os.remove(filename)
    Quand je lance le code j'ai ce message d'erreur : PermissionError: [WinError 5] Accès refusé

    J'ai essayé plusieurs scripts trouvé sur le net pour passer à travers mais ça ne fonctionne pas non plus.
    Déjà peut être que mon code n'est pas bon à la base.
    Vous avez une idée ?

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 670
    Par défaut
    Salut,

    Citation Envoyé par Julianinho Voir le message
    J'ai essayé plusieurs scripts trouvé sur le net pour passer à travers mais ça ne fonctionne pas non plus. Déjà peut être que mon code n'est pas bon à la base.
    Lorsqu'on déballe un joujou de son carton, on commence par lire le mode d'emploi:
    os.remove(path, *, dir_fd=None)

    Remove (delete) the file path. If path is a directory, OSError is raised. Use rmdir() to remove directories.

    This function can support paths relative to directory descriptors.

    On Windows, attempting to remove a file that is in use causes an exception to be raised; on Unix, the directory entry is removed but the storage allocated to the file is not made available until the original file is no longer in use.
    This function is identical to unlink().
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Lorsqu'on déballe un joujou de son carton, on commence par lire le mode d'emploi:

    - W

    Salut wiztricks,

    Faut que je prenne cette habitude de regarder dans la doc, c'est pas encore un réflexe mais ça viendra !
    Effectivement avec votre lien tout devient plus clair déjà, mais je bloque encore dessus, quand je test avec j'ai un message d'erreur disant que le répertoire n'est pas vide. J'ai donc testé avec ça fonctionne mais à moitié, il supprime bien le contenu du dossier mais il supprime également le dossier parent et je souhaiterais qu'il supprime uniquement son contenu mais tout en gardant le dossier parent vide.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 670
    Par défaut
    Salut,

    Citation Envoyé par Julianinho Voir le message
    J'ai donc testé avec ça fonctionne mais à moitié, il supprime bien le contenu du dossier mais il supprime également le dossier parent et je souhaiterais qu'il supprime uniquement son contenu mais tout en gardant le dossier parent vide.
    Dans ce cas, ce n'est plus la documentation qu'il faut regarder mais le source de rmtree dans le module shutil. Vous devriez pouvoir en faire un copier&coller et l'adapter pour qu'il ne détruise pas le répertoire parent (çà se passe à la fin).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour,

    Déjà, l'objectif a changé !

    avant :
    Citation Envoyé par Julianinho Voir le message
    ... qui consiste à supprimer le contenu du dossier (fichier et sous dossiers).
    maintenant :
    Citation Envoyé par Julianinho
    ... mais il supprime également le dossier parent et je souhaiterais qu'il supprime uniquement son contenu mais tout en gardant le dossier parent vide.

    Si je m'en tiens au dernier objectif, je déconseille l'utilisation de shutil.rmtree.
    Ca "sent à plein nez" le os.path.isdir couplé à un else et la récursivité pour ne détruire que les fichiers "réguliers".

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Dans ce cas, ce n'est plus la documentation qu'il faut regarder mais le source de rmtree dans le module shutil. Vous devriez pouvoir en faire un copier&coller et l'adapter pour qu'il ne détruise pas le répertoire parent (çà se passe à la fin).

    - W
    Ok merci je regarde ça ce soir et je vous tiens au courant si ça fonctionne !


    Citation Envoyé par plxpy Voir le message
    Bonjour,

    Déjà, l'objectif a changé !

    avant :


    maintenant :

    Si je m'en tiens au dernier objectif, je déconseille l'utilisation de shutil.rmtree.
    Ca "sent à plein nez" le os.path.isdir couplé à un else et la récursivité pour ne détruire que les fichiers "réguliers".
    Bonjour,

    L'objectif n'a pas changé, je souhaite toujours supprimer le contenu d'un dossier, c'est juste que je n'ai pas précisé dans mon 1er post que je ne souhaite pas supprimer le dossier parent (mais je pensais qu'on m'aurait tout de même compris en disant "supprimer le contenu d'un dossier", voila tout ^^).

    Sinon que me conseillez vous si vous me déconseillez l’utilisation de "shutil.rmtree".

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    J'ai essayé de récupérer le code sur le lien donné mais je n'arrive pas à le faire fonctionner, ça supprime toujours la totalité du dossier parent avec son contenu.

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la mesure où c'est possible par le système de permission, il est plus simple d'accepter que le répertoire soit supprimé et de le recréer tout de suite après.

    Sinon: le dire parce que je dois avoir un petit code qui pourrait faire le boulot avec une petite adaptation.

    [Edit] finalement, c'est très simple: le code est donné dans la doc! => chercher os.walk

    Voilà le code adapté et commenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import os
     
    #############################################################################
    def efface_repertoire(repertoire):
        """efface le contenu d'un répertoire (fichiers, sous-répertoires)
           sans effacer le répertoire lui-même
           Attention: ne pas se tromper dans le répertoire donné! si on donne 
           '/' (unix) ou '\' (Windows), on efface tout le disque!!!
        """
        for rep, sreps, fics in os.walk(repertoire, topdown=False):
            # effacement des fichiers trouvés dans le répertoire rep
            for fic in fics:
                os.remove(os.path.join(rep, fic))
            # effacement des sous-répertoires trouvés dans le répertoire rep
            for srep in sreps:
                os.rmdir(os.path.join(rep, srep))
    L'astuce réside dans l'argument topdown=False parce que la suppression d'un répertoire n'est possible que s'il est vide. Cela impose que le parcours récursif le permette.

    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repertoire = r"E:\chemin\le_repertoire_a_effacer"
     
    efface_repertoire(repertoire)
    Ça a l'air de très bien marcher et d'être très rapide.

    Comme dit dans la doc et dans mon docstring, il ne faut pas se tromper dans le répertoire donné à la fonction, parce qu'il est facile de supprimer tout le disque...

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 670
    Par défaut
    Salut,

    Citation Envoyé par Julianinho Voir le message
    J'ai essayé de récupérer le code sur le lien donné mais je n'arrive pas à le faire fonctionner, ça supprime toujours la totalité du dossier parent avec son contenu.
    ce code est le code de shutil.rmtree, si vous ne le modifiez pas pour que le répertoire de départ ne soit pas supprimé... çà ne fera pas plus ce que vous voulez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Dans la mesure où c'est possible par le système de permission, il est plus simple d'accepter que le répertoire soit supprimé et de le recréer tout de suite après.

    Sinon: le dire parce que je dois avoir un petit code qui pourrait faire le boulot avec une petite adaptation.

    [Edit] finalement, c'est très simple: le code est donné dans la doc! => chercher os.walk

    Voilà le code adapté et commenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import os
     
    #############################################################################
    def efface_repertoire(repertoire):
        """efface le contenu d'un répertoire (fichiers, sous-répertoires)
           sans effacer le répertoire lui-même
           Attention: ne pas se tromper dans le répertoire donné! si on donne 
           '/' (unix) ou '\' (Windows), on efface tout le disque!!!
        """
        for rep, sreps, fics in os.walk(repertoire, topdown=False):
            # effacement des fichiers trouvés dans le répertoire rep
            for fic in fics:
                os.remove(os.path.join(rep, fic))
            # effacement des sous-répertoires trouvés dans le répertoire rep
            for srep in sreps:
                os.rmdir(os.path.join(rep, srep))
    L'astuce réside dans l'argument topdown=False parce que la suppression d'un répertoire n'est possible que s'il est vide. Cela impose que le parcours récursif le permette.

    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repertoire = r"E:\chemin\le_repertoire_a_effacer"
     
    efface_repertoire(repertoire)
    Ça a l'air de très bien marcher et d'être très rapide.

    Comme dit dans la doc et dans mon docstring, il ne faut pas se tromper dans le répertoire donné à la fonction, parce qu'il est facile de supprimer tout le disque...

    Bonjour Tyrtamos,

    Votre code fonctionne nickel, le dossier parent est conservé tout en supprimant le contenu (fichier et sous dossier), c'est exactement ce que je cherchais.
    Je vais juste méditer sur ce code là pour comprendre son fonctionnement.
    Merci pour votre aide !



    Citation Envoyé par wiztricks Voir le message
    Salut,

    ce code est le code de shutil.rmtree, si vous ne le modifiez pas pour que le répertoire de départ ne soit pas supprimé... çà ne fera pas plus ce que vous voulez.

    - W
    Je l'avais modifié pourtant pour l'adapter mais j'ai du mal m'y prendre,
    Pour être sûr que je cherche au bon endroit c'est bien ce code là qui nous intéresse ?
    J'ai un doute car chez moi il est plutôt au début/milieu de page, en revanche à la fin de page je n'ai rien trouvé.

    edit : même si le code de tyrtamos fonctionne parfaitement, je souhaiterais juste par curiosité et par envie d'apprendre savoir tout de même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    def rmtree(path, ignore_errors=False, onerror=None):
     
        """Recursively delete a directory tree.
     
     
        If ignore_errors is set, errors are ignored; otherwise, if onerror
     
        is set, it is called to handle the error with arguments (func,
     
        path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
     
        path is the argument to that function that caused it to fail; and
     
        exc_info is a tuple returned by sys.exc_info().  If ignore_errors
     
        is false and onerror is None, an exception is raised.
     
     
        """
     
        if ignore_errors:
     
            def onerror(*args):
     
                pass
     
        elif onerror is None:
     
            def onerror(*args):
     
                raise
     
        try:
     
            if os.path.islink(path):
     
                # symlinks to directories are forbidden, see bug #1669
     
                raise OSError("Cannot call rmtree on a symbolic link")
     
        except OSError:
     
            onerror(os.path.islink, path, sys.exc_info())
     
            # can't continue even if onerror hook returns
     
            return
     
        names = []
     
        try:
     
            names = os.listdir(path)
     
        except os.error, err:
     
            onerror(os.listdir, path, sys.exc_info())
     
        for name in names:
     
            fullname = os.path.join(path, name)
     
            try:
     
                mode = os.lstat(fullname).st_mode
     
            except os.error:
     
                mode = 0
     
            if stat.S_ISDIR(mode):
     
                rmtree(fullname, ignore_errors, onerror)
     
            else:
     
                try:
     
                    os.remove(fullname)
     
                except os.error, err:
     
                    onerror(os.remove, fullname, sys.exc_info())
     
        try:
     
            os.rmdir(path)
     
        except os.error:
     
            onerror(os.rmdir, path, sys.exc_info())

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 670
    Par défaut
    Citation Envoyé par Julianinho Voir le message
    J'ai un doute car chez moi il est plutôt au début/milieu de page, en revanche à la fin de page je n'ai rien trouvé.
    Il serait moins perturbant de parler de fin de la fonction.

    Si on enlève ce qui ne nous intéresse pas, çà devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def rmtree(path, ignore_errors=False, onerror=None):
        # 
        # ... code effacé pour que ce soit plus clair
        #
        try:
            os.rmdir(path)
        except os.error:
            onerror(os.rmdir, path, sys.exc_info())
    En fait, le code "effacé" récupère les fichiers contenus dans "path" puis efface le fichier ou, si c'est un répertoire, appelle rmtree récursivement avec ce répertoire là (path) en paramètre. Quand c'est fini, il détruit le répertoire et c'est cette action là qu'on veut éviter pour le répertoire "parent". Donc il faut le faire conditionnellement... et sortir une variable "delete_topdir" du chapeau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def rmtree(path, ignore_errors=False, onerror=None, delete_topdir=True):
        # 
        # ... code effacé pour que ce soit plus clair
        #
        if delete_topdir:
            try:
                os.rmdir(path)
            except os.error:
                onerror(os.rmdir, path, sys.exc_info())
    Pour que çà fonctionne, il faut bien sûr appeler cette nouvelle fonction en précisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rmtree(...., delete_topdir=False)
    car, par défaut, delete_topdir sera True (c'est la raison pour laquelle les répertoires contenus dans... seront détruits comme avant)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Le code rmtree de shutil est vraiment complexe. C'est un peu normal puisqu'il doit comprendre tous les cas de figure possibles des différents OS et des possibilités d'erreurs lors de la suppression des fichiers et des sous-répertoires.

    Par contre, mon code est un peu trop simple dans la mesure où il ne traite aucune erreur. On risque ainsi soit qu'il se plante avant la fin, soit qu'il se termine silencieusement alors que le boulot n'a pas été fait complètement. Il faudrait donc ajouter ce qui manque pour prévenir les erreurs, et s'il y en a, qu'on puisse les récupérer.

    Par exemple, par défaut, os.walk ne tient pas compte des sous-répertoires dans lesquels il ne peut pas rentrer. Pour les connaître, il faut paramétrer un "callback" en argument qui pourra afficher et/ou mémoriser ces sous-répertoires en échec. Pour le reste, il faudra mettre des try..except pour les suppressions des fichiers et des sous-répertoires pour en faire la même chose.

    Ce n'est pas très important pour Windows, mais ça l'est pour les Unix (Linux et OS X) pour tenir compte des droits, des liens symboliques et peut-être aussi de chemins dangereux (type ".." ou "/") . Ceci pour éviter de faire des grosses bêtises...

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 670
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    Le code rmtree de shutil est vraiment complexe. C'est un peu normal puisqu'il doit comprendre tous les cas de figure possibles des différents OS et des possibilités d'erreurs lors de la suppression des fichiers et des sous-répertoires.
    C'est le savoir faire accumulé de plusieurs générations de développeurs qui prend en compte les bugs qui ont été remontés par les utilisateurs. Normal qu'il traite des cas de figures auxquels on ne pensera pas lorsqu'on écrit sa mouture sur un coin de table.
    C'est ce qui rend ces codes intéressants.
    De plus même si on ne comprends pas trop l'intérêt de tous les détails, on peut quand même en saisir les grandes lignes et oser l'adapter un peu pour répondre à des besoins particuliers.

    Cela peut être aussi prétexte à poster une demande d'amélioration aux développeurs de Python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Désolé pour la réponse tardive, je ne vous ai pas oublié, mais pas mal débordé avec mes clients.
    Je testerais tout ça et je vous tiens au courant de ce que ça donne !

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 94
    Par défaut
    Enfin, mieux vaux tard que jamais comme on dit.
    J'ai donc testé le code et tout fonctionne très bien.

    Je vais tester et essayer de créer de petits codes simple pour débuter et je les mettrais à disposition sur mon site.

    Merci pour vos conseils et votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2006, 23h42
  2. réseau local (accès refusé)
    Par le y@m's dans le forum Sécurité
    Réponses: 7
    Dernier message: 24/07/2005, 13h48
  3. [DCOM] Accès refusé au lancement du programme à distance
    Par raoulmania dans le forum Web & réseau
    Réponses: 7
    Dernier message: 22/06/2005, 13h01
  4. Kerio / Composants Indy / Accès refusé
    Par ixpe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/09/2004, 13h38
  5. acces refusé
    Par pram dans le forum XMLRAD
    Réponses: 3
    Dernier message: 02/04/2003, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo