假设以下目录结构:
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
,但手动执行每个函数不会产生此异常。我知道有shutil.rmtree
,但os.rmdir
的文档清楚地说明了
删除(删除)目录路径。 仅在目录为空时才有效,否则会引发
OSError
。为了删除整个目录树,可以使用shutil.rmtree()
。
似乎并非如此,至少在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
的{{3}}(对于Windows上的CPython 3.5),我们可以看到RemoveDirectoryW
用于删除。 RemoveDirectoryW
个州the source的备注部分
RemoveDirectory函数在关闭时标记要删除的目录。因此,在关闭目录的最后一个句柄之前,不会删除该目录。
即使我试图确保目录没有句柄,我认为这可能实际上是问题(感谢@armatita的提示)。