Выпуск Python `TemporaryDirectory` при отключении интерпретатора - PullRequest
1 голос
/ 04 июня 2019

Я использую tempfile.TemporaryDirectory.Мне нужен каталог, который живет столько же, сколько и моя программа.Однако я сталкиваюсь с некоторыми проблемами, когда интерпретатор выключается.

Рассмотрим пример макета:

import tempfile
import typing
import sys

class Foo:
   tempDir: tempfile.TemporaryDirectory
   file: typing.io

   def __del__():
      sys.stderr.write(''.join(['in finalizer ', self.tempDir.name, '\n']))
      self.file.close()
      self.tempDir.cleanUp()
      sys.stderr.write('finalizer done\n')

TemporaryDirectory автоматически регистрирует финализатор для удаления временного каталога с диска.Я делаю это, используя weakref.finalize.Когда интерпретатор выключается, я иногда вижу, что две операции финализатора вышли из строя: финализатор tempDir называется перед моим __del__() методом, описанным выше.В моем финализаторе у меня все еще есть отличная ссылка на TemporaryDirectory.

Вот сообщения об ошибках, которые я вижу:

Traceback (most recent call last):
  File "C:\Users\welterp\AppData\Local\Continuum\miniconda3\envs\qs3\lib\weakref.py", line 624, in _exitfunc
    f()
  File "C:\Users\welterp\AppData\Local\Continuum\miniconda3\envs\qs3\lib\weakref.py", line 548, in __call__
    return info.func(*info.args, **(info.kwargs or {}))
  File "C:\Users\welterp\AppData\Local\Continuum\miniconda3\envs\qs3\lib\tempfile.py", line 799, in _cleanup
    _shutil.rmtree(name)
  File "C:\Users\welterp\AppData\Local\Continuum\miniconda3\envs\qs3\lib\shutil.py", line 494, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Users\welterp\AppData\Local\Continuum\miniconda3\envs\qs3\lib\shutil.py", line 389, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Users\welterp\AppData\Local\Continuum\miniconda3\envs\qs3\lib\shutil.py", line 387, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\welterp\\AppData\\Local\\Temp\\tmpd6ps3rj6\\scalarData.h5'
in finalizer C:\Users\welterp\AppData\Local\Temp\tmpd6ps3rj6
finalizer done

Очевидно, что интерпретатор вызывает финализатор слабой ссылки перед моим!

Не имеет смысла для меня.

...