У меня есть программа 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 Здесь мне не нужно беспокоиться о безопасности; это часть модуля тестирования, поэтому самое большее, что может сделать кто-то нечестивый, - это вызвать ложный сбой наших модульных тестов. Ужас!
unlink
. А именноhandle, temp_file = tempfile.mkstemp()
. Тогда твой код. Наконец,os.close(handle)
иos.unlink(temp_file)
. - person KitKat   schedule 22.04.2014