Quale utente eseguono gli script Python come in Windows?
-
06-07-2019 - |
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.
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.