3

我有这样的项目设置

project/src/test/python/main.py
project/test-output

我希望删除主测试脚本,然后重新创建测试输出文件夹。

所以我把这段代码放在那里。

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 命令工作得很好。

4

4 回答 4

2

我最近在 Windows 7 下看到了 shutil.rmtree() 的这种行为,在从单元测试中创建和销毁测试文件夹时也是如此。而且,不,没有任何东西可以主动引用目录或其中的任何内容,甚至没有资源管理器窗口。我的“解决方案”(如果你可以这么说的话)是:

shutil.rmtree("my/test/dir", ignore_errors=True)

不完全是美丽的东西,但它为我解决了这个问题。

顺便说一句,这是一台 64 位 Windows 7 机器,在 SSD 上。在另一台机器上删除 Windows 共享目录时,一位同事报告了与 shutil.rmtree() 相同的问题。我感觉 Windows 在这里缓存了一些东西,即使只是短暂的。

于 2012-06-02T10:33:50.360 回答
1

Windows 仅将文件/目录标记为“关闭时删除”,这与取消链接会立即从视图中删除项目的 Unix 不同。请参阅MSDN中删除目录功能的文档。因此,如果任何进程(例如,资源管理器窗口、全文索引器或病毒扫描程序)仍然具有该文件的打开句柄,那么您将失败。

因此,即使您忽略删除错误,您也会在该os.mkdir步骤中失败。一个简单的解决方法是不重新创建目录,而只是删除其所有内容。另一种是等待并在几秒钟后重试操作。

绕过该限制的最佳方法是tempfile.makedtemp()每次运行都使用不同的输出文件夹(通过)。当最后一个引用消失时,您的删除就会开始,但您的重新创建永远不会失败。

于 2012-06-02T10:48:26.740 回答
0

很可能某些东西正在使用该文件夹 - 通过打开位于该文件夹内的文件或将该文件夹或其子文件夹作为其当前工作目录。

于 2012-06-02T10:06:52.827 回答
0

尝试这个:

def renewDir(name):
    while 1:
        try:
            if os.path.exists(name):
                shutil.rmtree(name)
            os.makedirs(name)   
            break
        except:
            pass
于 2013-06-06T15:13:02.347 回答