是否保证os.rmdir或shutil.rmtree在Windows上是同步的?

时间:2017-12-05 20:47:46

标签: python

似乎shutil.rmtree在Windows上不同步,因为我在下面的代码中有第二行引发了目录已经存在的错误

shutil.rmtree(my_dir)
os.makedirs(my_dir) #intermittently raises Windows error 183 - already exists

我们在Windows上看到了类似的问题 - see this question。除了轮询以查看文件夹是否真的消失之外,有没有什么好的方法可以在python中处理这个?

2 个答案:

答案 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>