2012-06-27 10 views
5

Ho bisogno di sviluppare uno script che avvierà alcuni calcoli. A desidera che questo script gestisca correttamente^C eliminando alcune directory temporanee. Ho provato diverse versioni di codice nel signal_handler:Python, rimuovi directory: errore File esiste

shutil.rmtree(self.temp) 

o anche

os.system("rm -rf " + self.temp) 

quando sto interrompendo l'esecuzione e il gestore è chiamato a rimuovere la directory, sto ottenendo gli errori come:

OSError: [Errno 17] File exists : 'foo' 

o

rm: Unable to remove directory foo: File exists 

Dopo l'esecuzione, la directory che voglio cancellare è vuota, e posso eliminarla con uno rm -r nella shell. Tuttavia, se eseguo il codice:

for f in os.listdir(self.temp): 
    os.remove(os.path.join(self.temp,f)) 

for f in os.listdir(self.temp): 
    print f 

os.rmdir(self.temp) 

Sono, ovviamente, ottenendo gli errori, ma il secondo ciclo trova questo file: .nfsA13D3

Chiunque ha una soluzione al mio problema? Grazie!

+6

I file '.nfs *' vengono creati quando si 'rm' un file su un supporto NFS che è ancora in uso da qualcosa. Una volta che il conteggio dei riferimenti sul file '.nfs' scende a 0, dovrebbe * scomparire * (ho avuto a che fare in casi in passato dove non sempre, però, richiede la pulizia manuale). – twalberg

risposta

0

Grazie per il commento, stavo aprendo i file nel mio codice Python e il mio signal_handler non ha verificato se i miei oggetti file erano chiusi o meno. Questo è il motivo per cui non sono stato in grado di eliminare la directory contenente questi file nello script.

7

Questo è un problema ben noto con i filesystem montati su nfs e alcune delle tue utilità non stanno chiudendo i file. Un sistema operativo può mantenere in vita il file anche se lo rimuovi, ma ciò non è possibile quando è coinvolto nfs. La soluzione per il sistema operativo è quella di creare quel file .nfs temporaneo e di mantenerlo finché il descrittore di file è in uso.

Non esiste una soluzione reale per questo problema. Il file .nfs sparirà quando l'ultimo descrittore è chiuso, ma la directory (vuota) sarà ancora in giro. L'unica soluzione possibile è trovare il descrittore di file ancora aperto e chiuderlo, ma dipende se è nel tuo programma. Nel mio caso, si trovava in una biblioteca esterna e compilata e non ho avuto alcuna possibilità di trovare dove è trapelata.

Problemi correlati