似乎shutil.rmtree在Windows上不同步,因为我在下面的代码中有第二行引发了目录已经存在的错误
shutil.rmtree(my_dir)
os.makedirs(my_dir) #intermittently raises Windows error 183 - already exists
我们在Windows上看到了类似的问题 - see this question。除了轮询以查看文件夹是否真的消失之外,有没有什么好的方法可以在python中处理这个?
答案 0 :(得分:2)
如果您对该文件夹仍然存在感到满意,并且您使用的是Python 3,那么您可以执行pass exist_ok=True
to os.makedirs
,它会忽略您尝试创建目录的情况存在:
shutil.rmtree(my_dir)
os.makedirs(my_dir, exist_ok=True)
如果做不到这一点,你就会陷入民意调查。循环运行你的代码(理想情况下,小睡眠以避免锤击磁盘),并且不要结束循环,直到makedirs
完成而没有错误:
import errno, os, shutil, time
while True:
# Blow away directory
shutil.rmtree(my_dir, ignore_errors=True)
try:
# Try to recreate
os.makedirs(my_dir)
except OSError as e:
# If problem is that directory still exists, wait a bit and try again
if e.winerror == 183:
time.sleep(0.01)
continue
# Otherwise, unrecognized error, let it propagate
raise
else:
# Successfully created empty dir, exit loop
break
在Python 3.3+上,你可能会改变:
except WindowsError as e:
# If problem is that directory still exists, wait a bit and try again
if e.errno == errno.EEXIST:
time.sleep(0.01)
continue
# Otherwise, unrecognized error, let it propagate
raise
只是:
except FileExistsError:
# If problem is that directory still exists, wait a bit and try again
time.sleep(0.01)
因为"存在特定的异常类型"您可以直接捕获(并允许所有其他OSError
/ WindowsError
异常不间断地传播。)
答案 1 :(得分:0)
对我有用的简单解决方案:
if os.path.isdir(destination):
shutil.rmtree(destination)
while os.path.isdir(destination):
pass
<other code>