Как я создаю именованный временный файл на окнах в Python?

У меня есть программа Python, которая должна создать именованный временный файл, который будет открыт и закрыт пару раз в течение программы и должен быть удален, когда программа выйдет. К сожалению, ни одна из опций в tempfile кажись, работать:

  • TemporaryFile не имеет видимого имени
  • NamedTemporaryFile создает подобный файлу объект. Мне просто нужно имя файла. Я попытался закрыть объект, который это возвращает (после того, как установка delete = False) но я получаю потоковые ошибки, когда я пытаюсь открыть файл позже.
  • SpooledTemporaryFile не имеет видимого имени
  • mkstemp возвраты и открытый файл возражают и имя; это не гарантирует, что файл удален, когда программа выходит
  • mktemp возвращает имя файла, но не гарантирует, что файл удален, когда программа выходит

Я попытался использовать mktemp1 в менеджере по контексту, как так:

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 я не должен волноваться о безопасности здесь; это - часть модуля тестирования, таким образом, большинство, которое кто-то низкий мог сделать, заставить наши модульные тесты побочно перестать работать. Ужас!

11
задан Chris B. 30 March 2010 в 23:23
поделиться

2 ответа

Если вас не волнует безопасность, что в этом не так?

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)
1
ответ дан 3 December 2019 в 11:03
поделиться

У меня есть точно такая же проблема, когда мне нужно было сохранить загруженный файл в открытый временный файл с помощью модуля csv. Больше всего раздражало то, что имя файла в WindowsError указывало на временный файл, но сохранение содержимого загружаемого файла в буфер StringIO и перемещение данных буфера во временный файл устранило проблему. Для моих нужд этого было достаточно, так как загруженные файлы всегда умещаются в памяти.

Проблема была только тогда, когда я загрузил файл со сценарием через CGI Apache, но когда я запустил аналогичный сценарий с консоли, я не смог воспроизвести проблему.

2
ответ дан 3 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: