Python,删除目录:错误文件已存在

6

我需要开发一个脚本来启动一些计算。我希望这个脚本能够正确处理^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

执行完毕后,我想要删除的目录为空,可以在shell中使用rm -r命令删除。然而,如果我执行以下代码:
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

有人有解决我的问题的方法吗? 谢谢!


6
当你在仍被某些东西使用的NFS挂载上使用rm删除一个文件时,会创建.nfs*文件。一旦.nfs文件的引用计数降至0,它应该会消失(尽管我过去遇到过不总是这样的情况,需要手动清理)。 - twalberg
2个回答

9
这是一个与nfs挂载的文件系统相关的众所周知的问题,而且您的一些实用程序没有关闭文件。操作系统可以保持文件的活动状态,即使您删除它,但当涉及nfs时,这是不可能的。操作系统的解决方案是创建那个临时的.nfs文件,并在文件描述符被使用时保留它。
这个问题实际上没有真正的解决方案。.nfs文件将在最后一个描述符关闭时消失,但(空)目录仍将存在。唯一可能的修复方法是找到仍然打开的文件描述符并将其关闭,但这取决于它是否在您的程序中。在我的情况下,它在一个外部编译的库中,我没有机会找到它泄漏的位置。

0
感谢您的评论,我在我的Python代码中打开了文件,我的信号处理程序没有检查我的文件对象是否关闭。这就是为什么我无法在脚本中删除包含这些文件的目录的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接