6

我需要开发一个脚本来启动一些计算。A 希望此脚本通过删除一些临时目录来正确处理 ^C。我在 signal_handler 中尝试了几个版本的代码:

shutil.rmtree(self.temp)

甚至

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

当我中断执行并调用处理程序以删除目录时,我收到如下错误:

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

或者

rm: Unable to remove directory foo: File exists

执行后,我要删除的目录是空的,可以rm -r在shell中用a删除。但是,如果我执行代码:

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)

当然,我遇到了错误,但是第二个循环找到了这个文件:.nfsA13D3

有人可以解决我的问题吗?谢谢 !

4

2 回答 2

9

这是 nfs 挂载文件系统的一个众所周知的问题,并且您的某些实用程序没有关闭文件。即使您将其删除,操作系统也可以使文件保持活动状态,但在涉及 nfs 时这是不可能的。操作系统的解决方案是创建该临时 .nfs 文件并保留它,直到文件描述符正在使用中。

这个问题没有真正的解决方案。当最后一个描述符关闭时,.nfs 文件将消失,但(空)目录仍然存在。唯一可能的解决方法是找到仍然打开的文件描述符并关闭它,但这取决于它是否在您的程序中。就我而言,它在一个外部的编译库中,我没有机会找到它泄漏的地方。

于 2012-06-28T07:22:10.273 回答
0

感谢您的评论,我在我的 python 代码中打开文件,而我的 signal_handler 没有检查我的文件对象是否已关闭。这就是为什么我无法在脚本中删除包含这些文件的目录。

于 2012-06-28T06:58:40.657 回答