2013-05-04 16 views
9

Molto spesso nella console di Windows 7 se si esegue un programma Python due volte molto rapidamente ciòAutorizzazione negata facendo os.mkdir (d) dopo l'esecuzione shutil.rmtree (d) in Python

if os.path.isdir(d): 
    shutil.rmtree(d) 
if not os.path.exists(d): 
    os.mkdir(d) 

dove d è il nome di una directory con molti file, ottengo un "Permesso negato" per il comando mkdir. Ma se corro una volta, poi attendo alcuni secondi, poi corro di nuovo non ho ricevuto questo errore. Qual è il problema qui?

+0

FYI alcuni thread di discussione correlati qui: https://groups.google.com/forum/#!topic/comp.lang.python/sVnSa5iWWzg – dim

risposta

6

Ci sono tre cose che vengono in mente:

  1. Windows stesso ritarda alcune operazioni sui file al fine di preservare i metadati. Se ad esempio rinomina un file e ne crei un altro nella sua posizione, Windows ha una finestra temporale in cui elementi come gli ACL vengono trasferiti nel nuovo file. Questa è una "caratteristica" per preservare questi metadati anche per i programmi che scrivono un nuovo file prima di eliminare quello vecchio, in modo da non perdere i dati quando qualcosa non riesce nel mezzo.

  2. Gli scanner di malware talvolta si agganciano alle operazioni del filesystem ed eseguono una scansione su file, alla ricerca di malware (o testi critici del governo, se sei paranoico, e forse anche se non sei paranoico). Durante questa scansione, alcuni altri accessi al file sono bloccati.

  3. Infine, io non sono sicuro di come shutil.rmtree() viene realizzato, ma sotto Windows, alcune operazioni di alberi vengono effettivamente attuato non dal nucleo operativo ma dalla shell (cioè Explorer) e potrebbe essere eseguita in modo asincrono, il che spiegherebbe una finestra di tempo breve in cui il percorso è ancora bloccato anche se la chiamata è già stata restituita.

Credo che per es. Subversion o piuttosto Apache Portable Runtime incappato nello stesso problema e ha lavorato intorno ad esso semplicemente riprovando con un ritardo. Questa soluzione non vince un concorso di bellezza, ma sembra Do The Job (tm).

+0

Sicuramente, sembra che l'utilizzo di un ritardo e quindi riprovare è l'unica soluzione. Grazie – mljrg

+2

C'è una soluzione più semplice. Solo la cartella "os.rename" prima dell'eliminazione. La ridenominazione è immediata. – garkin

+0

Definitivamente no (2), poiché questo comportamento è perfettamente riproducibile. Per me (3) sembra la spiegazione più plausibile. Le operazioni sui file essendo asincrone mi fanno riconsiderare usando shutil del tutto. – user443854