Почему я могу писать и читать временный файл даже после его закрытия?

Я экспериментировал с открытием текстовых редакторов из моего скрипта на python и заметил кое-что, что явно противоречит моему пониманию документации tempfile.

Мой эксперимент начался с ответа Алекса Мартелли.
Мой код -

import os
import tempfile
import subprocess

f = tempfile.NamedTemporaryFile(mode='w+t', delete=True)
n = f.name
print('Does exist? : {0}'.format(os.path.exists(n)))
f.close()
print('Does exist? : {0}'.format(os.path.exists(n)))

subprocess.run(['nano', n])
with open(n) as f:
    print (f.read())

print('Does exist? : {0}'.format(os.path.exists(n)))

ВЫХОД:

Does exist? : True
Does exist? : False
Hello from temp file.

Does exist? : True

В коде я явно называю close на объекте файла, объявленном с delete=TrueОднако даже тогда я могу писать и читать содержимое к нему. Я не понимаю, почему это происходит. Согласно документам

Если delete равно true (по умолчанию), файл удаляется сразу после его закрытия.

Если звонит close удаляет файл, тогда я не должен писать и читать его. Но он отображает правильное содержимое файла, который вы вводите, когда nano выполняет. И как временный файл, файл не виден в каталоге, где я открыл терминал и запустил скрипт. Что еще более странно, так это os.path.exists работает правильно в первые два раза и, возможно, неправильно в третий раз.
Я что-то здесь упускаю?

Дополнительный эксперимент:
Если я запускаю следующий код, то я ясно вижу созданный файл. Но этого не происходит в оригинальном коде.

n = '.temp'
subprocess.run(['nano', n])
with open(n) as f:
    print (f.read())

print('Does exist? : {0}'.format(os.path.exists(n)))

1 ответ

Решение

Давайте посмотрим на ваш код глубже.

Сначала вы создаете временный файл

f = tempfile.NamedTemporaryFile(mode='w+t', delete=True)
n = f.name
print('Does exist? : {0}'.format(os.path.exists(n)))

и этот вывод

Does exist? : True

так что не о чем беспокоиться. Тогда в следующих заявлениях

f.close()
print('Does exist? : {0}'.format(os.path.exists(n)))

вы закрываете файл, и фактически файл удаляется, потому что вы получаете следующий вывод:

Does exist? : False

Однако впоследствии вы воссоздаете свой файл через

subprocess.run(['nano', n])
with open(n) as f:
    print (f.read())

так вот почему после команды

print('Does exist? : {0}'.format(os.path.exists(n)))

возвращается

Does exist? : True
Другие вопросы по тегам