Domanda

Sto cercando di fare in modo che Python elimini alcune directory e ottengo errori di accesso su di esse. Penso che l'account utente di Python non abbia diritti?

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

è quello che ottengo quando eseguo lo script.
Ho provato

shutil.rmtree  
os.remove  
os.rmdir

restituiscono tutti lo stesso errore.

È stato utile?

Soluzione

Abbiamo riscontrato problemi durante la rimozione di file e directory su Windows, anche se li avevamo appena copiati, se impostati su "sola lettura". shutil.rmtree () ti offre una sorta di gestori di eccezioni per gestire questa situazione. Lo chiami e fornisci un gestore di eccezioni come questo:

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)

Potresti provare.

Altri suggerimenti

Non ho mai usato Python, ma presumo che funzioni come qualsiasi utente esegua lo script.

Gli script non hanno un utente speciale, vengono eseguiti solo con l'utente attualmente connesso che ha eseguito lo script.

Hai provato a verificare che:

  • stai cercando di eliminare un percorso valido? e quello
  • il percorso non ha file bloccati?

Se lo script viene eseguito come attività pianificata (che sembra probabile per uno script di cleanup), probabilmente verrà eseguito come SYSTEM. È (non saggio, ma) possibile impostare le autorizzazioni per le directory in modo che SYSTEM non abbia accesso.

Le directory sono vuote e, in caso contrario, tali metodi supportano l'eliminazione in modo decorsivo del contenuto di una directory?

Come stai eseguendo lo script? Da una sessione della console interattiva? In tal caso, basta aprire una finestra di comando DOS (usando cmd) e digitare 'whoami'. Ecco chi stai eseguendo gli script in modo interattivo.

Ok, ho visto le tue modifiche proprio ora ... perché non stampi il percorso e controlli le proprietà per vedere se l'account utente che esegue gli script ha i privilegi richiesti?

Se whoami non funziona sulla tua versione di Windows, puoi utilizzare le variabili di ambiente come SET USERNAME e SET DOMAINNAME dalla tua finestra di comando.

@ThomasH: un altro mattone sul muro.

Sui sistemi unix, è necessario assicurarsi che anche la directory principale sia scrivibile. Ecco un'altra versione:

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

Una soluzione semplice dopo aver cercato per ore è controllare prima se quella cartella esiste davvero!

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

Questo ha fatto il trucco per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top