在Python中运行shutil.rmtree(d)后,权限被拒绝执行os.mkdir(d)
通常在Windows7控制台中,如果我非常快地运行python程序两次,那么在Python中运行shutil.rmtree(d)后,权限被拒绝执行os.mkdir(d),python,io,shutil,Python,Io,Shutil,通常在Windows7控制台中,如果我非常快地运行python程序两次,那么 if os.path.isdir(d): shutil.rmtree(d) if not os.path.exists(d): os.mkdir(d) 其中d是包含许多文件的目录的名称,我得到mkdir命令的“权限被拒绝”。但如果我运行一次,然后等待几秒钟,然后再次运行,我不会得到这样的错误。 这里有什么问题?我想到三件事: Windows本身会延迟一些文件操作以保留元数据。例如,如果重命名一个文件并
if os.path.isdir(d):
shutil.rmtree(d)
if not os.path.exists(d):
os.mkdir(d)
其中d
是包含许多文件的目录的名称,我得到mkdir
命令的“权限被拒绝”。但如果我运行一次,然后等待几秒钟,然后再次运行,我不会得到这样的错误。
这里有什么问题?我想到三件事:
shutil.rmtree()
,但在Windows下,一些树操作实际上不是由操作系统内核实现的,而是由shell(即资源管理器)实现的,它们可以异步执行,这将解释一个短时间窗口,在该窗口中,即使呼叫已经返回,路径仍然被阻塞我相信,例如Subversion,或者更确切地说,ApachePortable运行时遇到了同样的问题,并通过延迟重试解决了这个问题。此解决方案不会赢得选美比赛,但似乎可以胜任(tm)。毫无疑问,使用延迟然后重试是唯一的解决方案。谢谢,这是更简单的解决办法。删除前只需“os.rename”文件夹。重命名是即时的。绝对不是(2),因为这种行为是完全可复制的。对我来说(3)听起来是最合理的解释。异步文件操作使我重新考虑使用shutil。@user443854-另一种可能的解释在Eryk Sun的回答中的讨论部分中提到:。基本上,在Windows下,“删除”会将文件标记为删除,但不会取消链接,直到最后一个文件句柄关闭。仅供参考此处的一些相关讨论线程: