2012-06-27 15 views
5

Necesito desarrollar un script que inicie algunos cálculos. A quiere que este script maneje^C correctamente eliminando algún directorio temporal. He intentado varias versiones de código en el signal_handler:Python, directorio eliminar: existe el archivo de error

shutil.rmtree(self.temp) 

o incluso

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

cuando estoy interrumpiendo la ejecución y se llamará al controlador para eliminar el directorio, que estoy recibiendo errores como:

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

o

rm: Unable to remove directory foo: File exists 

Después de la ejecución, el directorio que quiero eliminar está vacío, y puedo eliminarlo con un rm -r en el shell. Sin embargo, si ejecuto el código:

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) 

estoy, por supuesto, conseguir de errores, pero el segundo bucle encuentra este archivo: .nfsA13D3

Alguien tiene una solución a mi problema? ¡Gracias!

+6

'.nfs *' los archivos se crean cuando 'rm' es un archivo en un montaje NFS que todavía está siendo utilizado por algo. Una vez que el recuento de referencias en el archivo '.nfs' cae a 0, * debe * desaparecer (me he encontrado casos en el pasado donde no siempre, sin embargo, requiere limpieza manual). – twalberg

Respuesta

0

Gracias por el comentario, estaba abriendo archivos en mi código python y mi signal_handler no comprobó si los objetos de mi archivo estaban cerrados o no. Es por eso que no pude eliminar el directorio que contiene estos archivos en el script.

7

Este es un problema bien conocido con los sistemas de archivos montados nfs y algunas de sus utilidades no son archivos de cierre. Un sistema operativo puede mantener el archivo con vida incluso si lo elimina, pero esto no es posible cuando se trata de nfs. La solución para el sistema operativo es crear ese archivo .nfs temporal y mantenerlo hasta que el descriptor de archivo esté en uso.

No hay una solución real para este problema. El archivo .nfs desaparecerá cuando se cierre el último descriptor, pero el directorio (vacío) seguirá existiendo. La única solución posible es encontrar el descriptor de archivo aún abierto y cerrarlo, pero depende de si está en tu programa. En mi caso, fue en una biblioteca externa compilada y no tuve oportunidad de encontrar dónde se filtró.

Cuestiones relacionadas