【问题标题】:Flaky file deletion under Windows 7?Windows 7下的片状文件删除?
【发布时间】:2011-01-03 11:43:45
【问题描述】:

我有一个 Python 测试套件,可以创建和删除许多临时文件。在 Windows 7 下,shutil.rmtree 操作有时会失败(

这看起来也是两个线程或进程之间的计时问题,但这里也没有并发。

(部分)堆栈跟踪的两个示例:

  File "C:\ned\coverage\trunk\test\test_farm.py", line 298, in clean
    shutil.rmtree(cleandir)
  File "c:\python23\lib\shutil.py", line 142, in rmtree
    raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
WindowsError: [Errno 5] Access is denied removing xml_1

  File "C:\ned\coverage\trunk\test\test_farm.py", line 298, in clean
    shutil.rmtree(cleandir)
  File "c:\python23\lib\shutil.py", line 142, in rmtree
    raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
WindowsError: [Errno 3] The system cannot find the path specified removing out

在 Windows XP 上,它从未失败过。在 Windows 7 上,它会在几个不同的 Python 版本(2.3-2.6,不确定 3.1)中这样失败。

有人看到过这样的事情并有解决办法吗?代码本身在 bitbucket 上,供真正勤劳的人使用。

【问题讨论】:

    标签: python windows-7


    【解决方案1】:

    这是一个很长的镜头,但是您是否正在运行任何在后台扫描目录的程序?我在考虑防病毒/备份(也许 Windows 7 内置了类似的东西?我不知道)。在从 TortoiseSVN 启动的 TSVNCache.exe 进程中删除/移动文件时,我偶尔会遇到故障——似乎它会监视目录的变化,然后可能会打开它们以扫描文件。

    【讨论】:

    • 我喜欢这个理论来解释它为什么会发生。
    • 在对他的帖子的评论中,Ryan Ginstrom 提到了搜索索引——在我看来,这听起来像是另一个可能的候选人。
    【解决方案2】:

    我们在 Windows 上的 shutil.rmtree 也遇到了类似的问题,特别是看起来像您的第一个堆栈跟踪。我们通过使用带有 rmtree 的异常处理程序来解决它。详情请见this answer

    【讨论】:

    • 奇怪的是,如果我只是提供一个重试操作的 onerror 函数,问题似乎就停止了。
    • 这可能支持您对时间问题的看法。
    【解决方案3】:

    只是一个想法,但如果测试行为(创建和删除大量临时文件)不是应用程序实际执行的典型行为,也许您可​​以将这些测试文件操作移至 (c)StringIO,并保留一个套件测试应用程序实际文件创建/删除行为的功能测试。

    这样,您可以确保您的应用正常运行,而不会引入与应用无关的额外复杂性。

    【讨论】:

    • 这正是提高代码可测试性的正确思路。不过,就我而言,文件和目录对测试很重要。
    • 对。在这种情况下,请确保关闭搜索索引、“卷影复制”等。我还发现 Windows 7 对从其他进程中删除文件非常挑剔。
    【解决方案4】:

    我的猜测是您应该检查创建文件的代码,并确保它们在继续删除之前明确关闭。如果代码中没有明显的内容,请下载Process Monitor 的副本并观察那里的文件系统发生的情况。此工具将为您提供来自 Windows 的确切错误代码,并且应该可以对这种情况有所了解。

    【讨论】:

    • 这是个好主意,我会研究一下,但它如何解释“找不到指定的路径”错误?那些似乎是 rmtree 试图在 它已经被删除之后删除它?
    • 你不是在想Process Monitor,而不是Process Explorer吗?
    【解决方案5】:

    如果路径对于 Windows 来说太长(260 个字符),则会间歇性出现“系统找不到指定的路径:”错误。自动化任务通常使用生成长度超过 260 个字符的完全限定路径的相对引用来创建文件夹层次结构。任何尝试使用完全限定路径删除这些文件夹的脚本都会失败。

    我构建了一个使用相对路径引用的快速解决方法,但没有提供通用代码解决方案,只是警告提供的优秀答案可能对您没有帮助。

    【讨论】:

      【解决方案6】:

      我在使用 shutil.rmtree 命令时遇到了同样的问题,这个问题可能是由特殊文件名引起的。(例如:其他国家/地区语言:леме / Ö)

      请使用以下格式删除你想要的目录:

      import shutil
      
      shutil.rmtree(os.path.join("<folder_name>").decode('ascii'))
      

      尽情享受吧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 2013-08-10
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多