У меня есть программа 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()
... но это дает мне a WindowsError(32, 'The process cannot access the file because it is being used by another process')
. Имя файла используется процессом моя икра программы, и даже при том, что я удостоверяюсь, что процесс заканчивается, прежде чем я выйду, это, кажется, имеет состояние состязания из моего управления.
Каков лучший способ иметь дело с этим?
1 я не должен волноваться о безопасности здесь; это - часть модуля тестирования, таким образом, большинство, которое кто-то низкий мог сделать, заставить наши модульные тесты побочно перестать работать. Ужас!
Если вас не волнует безопасность, что в этом не так?
tmpfile_name = tempfile.mktemp()
# do stuff
os.unlink(tmpfile_name)
Вы может пытаться перестроить это. Если вы хотите, чтобы этот файл всегда удалялся при выходе из программы, вы можете заключить выполнение main ()
в try / finally
. Будь проще!
if __name__ == '__main__':
try:
tmpfile_name = tempfile.mktemp()
main()
except Whatever:
# handle uncaught exception from main()
finally:
# remove temp file before exiting
os.unlink(tmpfile_name)
У меня есть точно такая же проблема, когда мне нужно было сохранить загруженный файл в открытый временный файл с помощью модуля csv. Больше всего раздражало то, что имя файла в WindowsError указывало на временный файл, но сохранение содержимого загружаемого файла в буфер StringIO и перемещение данных буфера во временный файл устранило проблему. Для моих нужд этого было достаточно, так как загруженные файлы всегда умещаются в памяти.
Проблема была только тогда, когда я загрузил файл со сценарием через CGI Apache, но когда я запустил аналогичный сценарий с консоли, я не смог воспроизвести проблему.