假设以下目录结构:
A +-- B | +-- C | | +-- D | | | +-- E
没有目录包含任何文件(甚至不可见的文件)。 运行
os.rmdir("A/B/C/D/E"); os.rmdir("A/B/C/D"); os.rmdir("A/B/C"); os.rmdir("A/B"); os.rmdir("A")
在Python(3.5)产量
OSError: [WinError 145] The directory is not empty: '##'
其中##
是A
, B
, C
或D
,但手动执行每个函数不会产生此exception。 我知道有shutil.rmtree
,但shutil.rmtree
的文档明确指出
删除(删除)目录path。 仅当目录为空时才起作用 ,否则引发
OSError
。 为了移除整个目录树,可以使用shutil.rmtree()
。
这似乎并不是这种情况,至less在Windows系统上。 我发现迄今唯一的解决方法(不包括shutil.rmtree
)是
def rm (dir_path): while len(os.listdir(dir_path)) > 0: pass # Maybe include timeout here to not lock the program os.rmdir(dir_path)
这是一个错误或是os.rmdir
应该不会阻止,直到目录被删除?
编辑:看看os.rmdir
(在Windows上的CPython 3.5) 的来源 ,我们可以看到, RemoveDirectoryW
用于删除。 RemoveDirectoryW
文档的注释部分
RemoveDirectory函数在closures时标记要删除的目录。 因此,直到该目录的最后一个句柄closures,该目录才被删除。
即使我试图确保目录没有句柄,我认为这可能实际上是问题(感谢@armatita的提示)。