我有一个Python测试套件,可以创建和删除许多临时文件。在Windows 7下,shutil.rmtree操作有时会失败(<1%的时间)。失败显然是随机的,并不总是在相同的文件上,并不总是以相同的方式,但它总是在rmtree操作上。这似乎是某种时间问题。它也让人联想到Windows 7对权限和管理员权限的警惕性增强,但这里没有权限问题(因为代码刚刚创建了文件),并且没有管理员权限。
它看起来像两个线程或进程之间的计时问题,但这里也没有并发性。
(部分)堆栈跟踪的两个示例:
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上。
答案 0 :(得分:5)
这是一个很长的镜头,但你在运行任何扫描后台目录的东西吗?我在想防病毒/备份(也许Windows 7有内置的东西?我不知道)。从TortoiseSVN启动的TSVNCache.exe进程中删除/移动文件时,我偶尔会遇到一些故障 - 似乎它会查看目录中的更改,然后可能会打开它们来扫描文件。
答案 1 :(得分:1)
我的猜测是你应该查看创建文件的代码,并确保在继续删除它之前明确关闭它们。如果代码中没有任何明显的内容,请下载Process Monitor的副本,并观察文件系统上发生的情况。这个工具将为您提供来自Windows的确切错误代码,并且应该对这种情况有所了解。
答案 2 :(得分:1)
我们在Windows上遇到与shutil.rmtree类似的问题,特别是看起来像你的第一个堆栈跟踪。我们通过使用rmtree的异常处理程序解决了它。有关详细信息,请参阅this answer。
答案 3 :(得分:1)
只是一个想法,但如果测试行为(创建和删除大量临时文件)不是应用程序实际执行的典型行为,也许您可以将这些测试文件操作移动到(c)StringIO,并保留套件功能测试,用于测试应用程序的实际文件创建/删除行为。
这样,您可以确保您的应用行为正确,而不会引入与应用无关的额外复杂性。
答案 4 :(得分:0)
“系统无法找到指定的路径:”如果Windows路径太长(260个字符),则会出现间歇性错误。自动化任务通常使用相对引用创建文件夹层次结构,这些引用生成超过260个字符的完全限定路径。尝试使用完全限定路径删除这些文件夹的任何脚本都将失败。
我构建了一个使用相对路径引用的快速解决方法,但没有提供通用代码解决方案,只是警告提供的优秀答案可能对您没有帮助。
答案 5 :(得分:0)
我遇到了与shutil.rmtree命令相同的问题,此问题可能由特殊文件名引起。(例如:其他国家/地区语言:леме/Ö)
请使用以下格式删除所需的目录:
import shutil
shutil.rmtree(os.path.join("<folder_name>").decode('ascii'))
享受它!