【发布时间】:2018-06-01 19:06:49
【问题描述】:
考虑一下这个测试
import shutil, tempfile
from os import path
import unittest
from pathlib import Path
class TestExample(unittest.TestCase):
def setUp(self):
# Create a temporary directory
self.test_dir = tempfile.TemporaryDirectory()
self.test_dir2 = tempfile.mkdtemp()
def tearDown(self):
# Remove the directory after the test
shutil.rmtree(self.test_dir2)
shutil.rmtree(self.test_dir.name) #throws error
def test_something(self):
self.assertTrue(Path(self.test_dir.name).is_dir())
self.assertTrue(Path(self.test_dir2).is_dir())
if __name__ == '__main__':
unittest.main()
在tearDown 中却引发了错误
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmpxz7ts7a7'
指的是self.test_dir.name。
根据the source code for tempfile,两个元素是一样的。
def __init__(self, suffix=None, prefix=None, dir=None):
self.name = mkdtemp(suffix, prefix, dir)
self._finalizer = _weakref.finalize(
self, self._cleanup, self.name,
warn_message="Implicitly cleaning up {!r}".format(self))
而且我没有在上下文中使用它,所以据我所知,不应调用 __exit__()。
发生了什么?
【问题讨论】:
-
请不要更改
tempfile的标签,这是正在使用的python 模块。temporary-files可能会产生误导。 -
我最后试了一下,效果很好:/
-
一个
TemporaryDirectory在相应对象被垃圾回收时自动删除。也就是说,我不知道为什么在tearDown函数完成执行之前 会对其进行垃圾收集。 -
您确定它是
shutil.rmtree(self.test_dir.name)而不是self.test_dir的终结器吗?您是否尝试过 not 来清理它,在退出上下文/垃圾收集时它不是被清理了吗? “在临时目录对象的上下文或销毁完成后,新创建的临时目录及其所有内容都将从文件系统中删除。”
标签: python python-3.x python-unittest temporary-files shutil