Почему не питон `NamedTemporaryFile` по умолчанию `удалить` на `false`?



Я пытался использовать tempfile.NamedTemporaryFile в Python 3. Я обнаружил, что если я хочу вызвать любой другой процесс, используя subprocess.call или такой, передавая новое имя файла, я должен использовать delete = false, а затем удалить файл вручную, используя os.unlink. Я предполагаю, что я должен close() файл, прежде чем позволить другому процессу открыть его (в моем случае, вызов компилятора для компиляции исходного файла, созданного из Python), и, по-видимому, файл удаляется после закрытия.



Интересно, если Python уже предоставляет tempfile.TemporaryFile для создания временных файлов, которые не имеют имен, то какой смысл использоватьименованный временный файл, если он не позволяет другим процессам обращаться к ним?



Мне кажется, что по умолчанию должно быть не удалять созданный файл после закрытия файла и возлагать ответственность за удаление временного файла на пользователя, нет? На самом деле, кажется, что аргумент delete сам по себе бессмыслен из-за этого, так как если файл будет быть удаленным в любом случае, тогда зачем нам нужно его имя, поэтому NamedTemporaryFile никогда не следует удалять...

678   3  

3 ответов:

Это неверное предположение, что вы должны закрыть файл, прежде чем другие процессы смогут получить к нему доступ. Фактически, как вы заметили, когда вы вызываете close на NamedTemporaryFile, он удаляет файл на диске по умолчанию.

С tempfiles, как и со всем Python, важны область и время жизни. Это одна из самых замечательных вещей в объектно-ориентированных языках, объекты убирают за собой, когда они больше не нужны (либо удаляются, либо выходят из области видимости). После разрушения, tempfile объекты освобождают все ресурсы в памяти и именованные файлы на диске.

Таким образом, если вы хотите использовать временный файл на диске, используя имя файловой системы, NamedTemporaryFile должен быть в области видимости и открыт. Это не гарантируется на всех платформах, но в Unix/Linux файл должен быть доступен в файловой системе другими процессами. Однако NamedTemporaryFile создает файл для чтения и записи только владельцем (разрешение unix 0600: - rw - - - - - -).

Если вы хотите / нуждаетесь чтобы сделать больше этого управления и очистки самостоятельно, вы можете рассмотреть возможность использования функции нижнего уровня tempfile.mkstemp(). Например,

fd, tempfilename = tempfile.mkstemp()
f = os.fdopen(fd)

В любом случае убедитесь, что вы очистили буферы, прежде чем передать имя файла другому процессу, файлу.промывать().

, Так что вы можете использовать его в операторе with в качестве контекстного менеджера, и вы можете получить имя файла через свойство name. Рассмотрим:

with tempfile.NamedTemporaryFile() as tmp_file:
    subprocess.call(['foo', tmp_file.name])
    do_something_with(tmp_file)

Это автоматически удалит файл, когда тело оператора with будет выведено либо нормально, либо в виде исключения.

1 что заставляет вас говорить, что вы не можете получить доступ к временному файлу. Если вы кодируете форки и файл не был закрыт, вы все еще можете получить к нему доступ.FH "находятся" и в раздвоенном процессе

2 Если ответственность за удаление файла будет лежать на пользователе, то я бы сказал, что нет необходимости в таком модуле. Если я хочу сохранить файл, то я буду обрабатывать его сам, но если мне просто нужно написать в файл и не беспокоиться об этом, то я использую модуль temofile, и модуль настолько хорош, что он позволяет мне сохранить файл. файл, если мне действительно нужно

Comments

    Ничего не найдено.