Это не связано с контекстом:
import tempfile,os
t = tempfile.TemporaryDirectory()
s = t.name
print(os.path.isdir(s))
# os.rmdir(s) called here triggers error on the next line
t = None
print(os.path.isdir(s))
он печатает
True
False
Так что, как только для ссылки t
установлено значение None
, объект собирается икаталог удаляется, поскольку документация гласит:
По завершении контекста или уничтожении объекта временного каталога вновь созданный временный каталог и всеего содержимое удаляется из файловой системы.
Раскомментирование os.rmdir(s)
в приведенном ниже фрагменте кода вызывает исключение при завершении объекта:
Exception ignored in: <finalize object at 0x20b20f0; dead>
Traceback (most recent call last):
File "L:\Python34\lib\weakref.py", line 519, in __call__
return info.func(*info.args, **(info.kwargs or {}))
File "L:\Python34\lib\tempfile.py", line 698, in _cleanup
_shutil.rmtree(name)
File "L:\Python34\lib\shutil.py", line 482, in rmtree
return _rmtree_unsafe(path, onerror)
File "L:\Python34\lib\shutil.py", line 364, in _rmtree_unsafe
onerror(os.listdir, path, sys.exc_info())
File "L:\Python34\lib\shutil.py", line 362, in _rmtree_unsafe
names = os.listdir(path)
Таким образом, ваш вызов, вероятно, завершится успешно, но вы получитеисключение при финализации объекта (сразу после этого)
Вызов cleanup()
метода объекта вместо rmtree
решает проблему, поскольку внутреннее состояние объекта обновляется для , а не , чтобы попытатьсяудалить каталог после его завершения (если вы спросите меня, объект должен проверить, существует ли каталог, прежде чем пытаться его очистить, но даже это не всегда работает, так какэто не атомарная операция)
Так что замените
shutil.rmtree(self.test_dir.name)
на
self.test_dir.cleanup()
или вообще ничего, пусть объект очистит каталог при удалении.