Mon code:

if os.path.exists(myDir):
    shutil.rmtree(myDir)
os.mkdir(myDir)

Problème: Cela fonctionne toujours si myDir n'existe pas. Si myDir existe, parfois il génère une erreur, parfois cela fonctionne.

Journal des erreurs:

os.mkdir(myDir)
PermissionError: [WinError 5] Access is denied: 'myDir'

Ma conjecture: quand j'appelle os.mkdir, shutil.rmtree n'a parfois pas terminé l'exécution / n'a pas libéré l'autorisation pour le répertoire. D'où l'erreur.

Existe-t-il un moyen de garantir l'exécution complète de shutil.rmtree avant d'appeler os.mkdir?

7
TuTan 13 avril 2018 à 07:47

3 réponses

Meilleure réponse

J'ai donc rencontré le même problème. Ce que j'utilise est une pause après shutil.rmtree. Je pense que presque tout ce qui amène votre ordinateur à utiliser un cycle d'horloge ferait l'affaire. Tout le code:

import os 
import shutil 
import time

dataDir = 'C:/Data/'
if os.path.exists(TEMPDIR):
    shutil.rmtree(TEMPDIR)
time.sleep(.0000000000000001)
os.makedirs(TEMPDIR)
4
John Gander 6 sept. 2018 à 00:11

J'ai rencontré des problèmes similaires / le même message d'erreur sur Windows 10 avec des appels à shutil.rmtree (dir) auxquels l'accès est refusé et qui ne sont pas exécutés par la suite. Ceci dans un programme de sauvegarde primitif que j'ai écrit et qui est conçu pour supprimer les sauvegardes au-delà d'un certain âge. Je teste toujours ce qui suit, mais jusqu'à présent, cela fonctionne comme une solution de contournement temporaire dans mes configurations, mais votre kilométrage peut varier.

L'exécution du script en tant qu'administrateur n'a pas aidé non plus. Utilisation de os.chmod (f, S_IWRITE) [et / ou stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR | stat.S_IWGRP | stat.S_IXGRP] a également obtenu le même refus de l'OS. Changer l'accès contrôlé aux dossiers (qui, je le soupçonne, peut être à l'origine de cela dans Windows 10) et également modifier les propriétés en lecture seule sur les répertoires respectifs n'a pas aidé non plus. Ni le changement de propriétaire ni l'accès en écriture dans l'aide de l'onglet sécurité.

La solution de contournement que j'utilise actuellement consiste à installer, importer et utiliser le module «send2trash» qui peut être utilisé pour supprimer le répertoire - en supposant que votre programme est par ailleurs sain - sans ladite erreur d'accès.

Par la suite, on peut supprimer le fichier de la corbeille à la main ou par des moyens automatisés (après l'importation du shell de win32com.shell) - évidemment, cette deuxième étape supprimera tous les fichiers de la corbeille. Donc, vérifiez absolument et pensez AVANT de lancer cela, sinon vous risquez de perdre des données que vous ne voulez pas ...).

J'espère que ceci est utile.

0
user7350253user7350253 1 août 2018 à 07:29

Si au début vous ne réussissez pas ...

if os.path.exists(report_path):
    shutil.rmtree(report_path)
while True:
    try:
        os.mkdir(report_path)
        break
    except PermissionError:
        print('Damned Win 10 PERMISSION exception, trying again')
        continue

... et si cela ne fonctionne pas, il y a au moins <ctrl> -c

1
timctran 18 juil. 2019 à 20:41