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

Я экспериментировал с открытием текстовых редакторов из своего скрипта 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, однако даже тогда я могу записывать и читать его содержимое. Я не понимаю, почему это происходит. Согласно документам-

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

Если вызов close удалит файл, то Я НЕ ДОЛЖЕН иметь возможность писать, а затем читать его. Но он отображает правильное содержимое файла, который вы вводите при выполнении nano. И, как и tempfile, файл не виден в каталоге, в котором я открыл терминал и запустил скрипт. Что еще более странно, так это то, что 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)))

person jar    schedule 11.11.2018    source источник
comment
Из документации. Если для удаления установлено значение true (по умолчанию), файл удаляется, как только он закрывается.   -  person jar    schedule 11.11.2018
comment
Я не могу воспроизвести вашу ошибку. Файл удаляется сразу после закрытия.   -  person DYZ    schedule 11.11.2018
comment
@DYZ извините, я забыл добавить вывод. Отредактировано сейчас. Ошибки НЕТ. Проблема в том, что это НЕ ДОЛЖНО работать. Почему это работает?   -  person jar    schedule 11.11.2018
comment
В порядке. Это nano, который снова создает ваш временный файл.   -  person DYZ    schedule 11.11.2018


Ответы (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
person quant    schedule 11.11.2018
comment
Да, точно. Но тогда почему я не вижу файл в рабочем каталоге? Я отредактировал вопрос, чтобы добавить эту информацию. Я пишу только последнюю часть кода и вижу, что он создает временный файл. Но почему его не видно в оригинале? - person jar; 11.11.2018
comment
@raj tempfile создает файл не в рабочем каталоге, а в каталоге временных файлов. Таким образом, вы никогда не увидите файл в рабочем каталоге. - person quant; 11.11.2018
comment
@raj Временный файл открыт в /tmp. - person DYZ; 11.11.2018
comment
@DYZ Не обязательно, например, вы также можете изменить путь к рабочему каталогу (linux: stackoverflow.com/questions/31068/ windows: answers.microsoft.com/en- us/windows/forum/windows_7-files/) - но в большинстве случаев вы правы - person quant; 11.11.2018
comment
@DYZ да, я только что проверил свою папку / tmp, и файлы, для которых я сделал delete=False, были там. Я просто хотел спросить, будут ли эти файлы там навсегда? Кроме того, поскольку это отвечает на мой вопрос, а мой вопрос сейчас выглядит глупо, должен ли я оставить его, удалить или принять ответ @quant? - person jar; 11.11.2018
comment
@raj Вы можете оставить вопрос здесь. Затем, когда у кого-то возникнет похожий вопрос, я могу просто пометить его вопрос как дублированный. - person quant; 11.11.2018
comment
@квант хорошо. Тем не менее, я приму ваш ответ и, возможно, добавлю один из своих собственных, подводя итог нашим комментариям, если вы не возражаете? - person jar; 11.11.2018
comment
@ray К вашему сведению, мой вопрос сейчас выглядит глупо ... Вы не знали, что временные папки создаются в файле temp. каталог - так что я не считаю ваш вопрос глупым или глупым. - person quant; 11.11.2018