Frage

Ich versuche, Python einige Verzeichnisse zu haben, zu löschen und ich Zugriff bekommen Fehler auf ihnen. Ich denke sein, dass das Python-Benutzerkonto keine Rechte hat?

WindowsError: [Error 5] Access is denied: 'path'

ist das, was ich bekomme, wenn ich das Skript ausführen.
Ich habe versucht,

shutil.rmtree  
os.remove  
os.rmdir

Sie alle geben den gleichen Fehler.

War es hilfreich?

Lösung

Wir haben Probleme Dateien und Verzeichnisse unter Windows zu entfernen, selbst wenn wir sie nur kopiert hatten, wenn sie auf ‚Read-only‘ gesetzt wurden. shutil.rmtree() bietet Ihnen eine Art Ausnahmebehandler mit dieser Situation zu umgehen. Sie nennen es und eine Exception-Handler wie folgt liefern:

import errno, os, stat, shutil

def handleRemoveReadonly(func, path, exc):
  excvalue = exc[1]
  if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
      os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
      func(path)
  else:
      raise

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly)

Sie möchten, dass versuchen.

Andere Tipps

Ich habe Python nie benutzt, aber ich würde davon ausgehen, es läuft als was auch immer Benutzer das Skript ausgeführt wird.

Die Skripte keinen speziellen Benutzer haben, laufen sie nur unter dem aktuell angemeldeten Benutzer, die das Skript ausgeführt wird.

Haben Sie, dass versucht Überprüfung:

  • Sie versuchen, einen gültigen Pfad zu löschen? und dass
  • der Pfad hat keine gesperrten Dateien?

Wenn das Skript als geplante Task ausgeführt wird (die für einen Cleanup-Skript wahrscheinlich scheint), wird es wahrscheinlich als SYSTEM ausgeführt. Es ist (unklug, aber) möglich Berechtigungen auf Verzeichnisse zu setzen, so dass SYSTEM keinen Zugriff hat.

Sind die Verzeichnisse leer, und wenn nicht tun diese Methoden decursively unterstützen, den Inhalt eines Verzeichnisses zu löschen?

Wie läuft das Skript? Von einer interaktiven Konsolensitzung? Wenn ja, nur ein DOS-Eingabefenster öffnen (mit cmd) und geben Sie ‚whoami‘. Das heißt, die Sie die Skripte interaktiv ausgeführt werden.

Ok, ich habe Ihre Bearbeitungen gerade jetzt ... warum Sie den Pfad nicht drucken und die Eigenschaften überprüfen, um zu sehen, ob das Benutzerkonto die das Ausführen von Skripts über die erforderlichen Berechtigungen hat?

Wenn whoami nicht auf Ihrer Windows-Version nicht funktioniert, können Sie die Umgebungsvariablen wie SET NUTZERNAME und SET DOMäNEN aus dem Befehlsfenster verwenden.

@ThomasH. Ein weiterer Stein an der Wand

Auf Unix-Systemen müssen Sie das übergeordnete Verzeichnis ist auch beschreibbar zu gewährleisten. Hier ist eine andere Version:

def remove_readonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:

        # ensure parent directory is writeable too
        pardir = os.path.abspath(os.path.join(path, os.path.pardir))
        if not os.access(pardir, os.W_OK):
            os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO)

        os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
        func(path)
    else:
        raise

Einfache Lösung für Stunden nach der Suche ist zunächst zu prüfen, ob der Ordner tatsächlich existiert!

GIT_DIR="C:/Users/...."
if os.path.exists(GIT_DIR):
    shutil.rmtree(GIT_DIR)

Dies hat den Trick für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top