我有像这样的项目设置
project/src/test/python/main.py
project/test-output
我希望main-testscript删除然后重新创建测试输出文件夹。
所以我把这段代码放在那里。
if os.path.exists("test-output"):
shutil.rmtree("test-output")
os.mkdir("test-output")
但是当我用
运行它时d:\projects\thisproject>python src\test\python\main.py
我从Windows获得访问拒绝错误。 [错误5]
如何解决这个问题?
mkdir命令工作得很好。
答案 0 :(得分:2)
我最近在Windows 7下看到了shutil.rmtree()的这种行为,也是在从单元测试中创建和销毁测试文件夹的时候。并且,不,没有任何活动引用目录或其中的任何内容,甚至没有资源管理器窗口。我的'解决方案'(如果你可以称之为)就是这样做:
shutil.rmtree("my/test/dir", ignore_errors=True)
不完全是美丽的东西,但它解决了我的问题。
顺便说一下,这是一台64位Windows 7机器,而且是SSD。删除另一台计算机上Windows共享上的目录时,同事报告了与shutil.rmtree()相同的问题。我觉得Windows正在缓存这里的内容,如果只是简单的话。
答案 1 :(得分:1)
Windows仅将文件/目录标记为'删除关闭'与Unix不同,其中unlink立即从视图中删除项目。请参阅MSDN中Remove Directory函数的文档。因此,如果任何进程(例如资源管理器窗口,全文索引器或病毒扫描程序)仍然具有该文件的打开句柄,则会失败。
因此,即使您忽略删除错误,您也会在os.mkdir
步骤中失败。一个简单的解决方法是不重新创建目录,而只是删除其所有内容。另一种是等待并在几秒钟后重试操作。
围绕该限制的最佳方法是为每次运行使用不同的输出文件夹(通过tempfile.makedtemp()
)。当你的最后一个引用消失时,你的删除就会被踢掉,但你的重新创建永远不会失败。
答案 2 :(得分:0)
最有可能的是使用该文件夹 - 通过打开位于该文件夹内的文件,或者将文件夹或其子文件夹作为其当前工作目录。
答案 3 :(得分:0)
试试这个:
def renewDir(name):
while 1:
try:
if os.path.exists(name):
shutil.rmtree(name)
os.makedirs(name)
break
except:
pass