考虑这个测试

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/

10-12 18:41