考虑这个测试
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
行引起的!
关于python - `shutil.rmtree`不适用于`tempfile.TemporaryDirectory()`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50649701/