考虑这个测试
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__()
。
发生了什么事?
不要使用 shutil
清除这些。 tempfile.TemporaryDirectory
类提供了一个 cleanup()
方法,如果您想选择加入显式清理,只需调用该方法即可。
您的代码崩溃的原因是 TemporaryDirectory
类被设计为在超出范围后自行清理(引用计数为零)。但是,由于您已经手动从文件系统中删除了该目录,因此当实例随后尝试删除自身时,拆卸会失败。 “没有这样的文件或目录”错误来自 TemporaryDirectory
自己的拆卸,它不是来自您的 shutil.rmtree
行!
我是一名优秀的程序员,十分优秀!