У меня есть программа Python, которая должна создать именованный временный файл, который будет открыт и закрыт пару раз в течение программы и должен быть удален, когда программа выйдет. К сожалению, ни один из вариантов в tempfile
не работает:
-
TemporaryFile
не имеет видимого имени -
NamedTemporaryFile
создает файл-подобный объект. Мне просто нужно имя файла. Я попытался закрыть объект, который он возвращает (после установкиdelete = False
), но я получаю потоковые ошибки, когда пытаюсь открыть файл позже. -
SpooledTemporaryFile
не имеет видимого имени -
mkstemp
возвращает объект открытого файла и имя; он не гарантирует, что файл будет удален, когда программа выйдет из -
mktemp
возвращает имя файла, но не гарантирует, что файл будет удален при выходе из программы
Я попытался использовать mktemp
1 в контекстном менеджере, например:
def get_temp_file(suffix):
class TempFile(object):
def __init__(self):
self.name = tempfile.mktemp(suffix = '.test')
def __enter__(self):
return self
def __exit__(self, ex_type, ex_value, ex_tb):
if os.path.exists(self.name):
try:
os.remove(self.name)
except:
print sys.exc_info()
return TempFile()
... но это дает мне WindowsError(32, 'The process cannot access the file because it is being used by another process')
. Имя файла используется процессом, который запускается моей программой, и даже если я гарантирую, что процесс завершится до моего выхода, он, похоже, имеет состояние гонки вне моего контроля.
Какой лучший способ справиться с этим?
1 Мне не нужно беспокоиться о безопасности здесь; это часть модуля тестирования, так что большинство людей, которые могут быть вредны, могут привести к ложным ошибкам наших модульных тестов. Ужас!