Python: нужно закрыть файл из mkstemp, если я использую fdopen?
Какое из следующего правильнее?
fi, path = tempfile.mkstemp()
f = os.fdopen(fi, "w")
f.write(res)
f.close()
os.close(fi)
или
fi, path = tempfile.mkstemp()
f = os.fdopen(fi, "w")
f.write(res)
f.close()
Ответы
Ответ 1
Проверьте f.fileno()
, он должен быть таким же, как fi
. Вы должны когда-либо закрывать этот дескриптор файла один раз, поэтому второй правильный.
В Unix первое вызывает ошибку:
>>> f.close()
>>> os.close(fi)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 9] Bad file descriptor
Ответ 2
Если на достаточно недавнем Python вы можете играть в гольф до:
with os.fdopen(tempfile.mkstemp()[0]) as f:
f.write(res)
Ответ 3
Продолжая последующие действия по последним ответам, если вам нужен путь:
f_handle, f_path = tempfile.mkstemp()
with os.fdopen(f_handle, 'w') as f:
f.write(res)
try:
# Use path somehow
some_function(f_path)
finally:
# Clean up
os.unlink(f_path)
Ответ 4
Я бы сделал:
fi, path = tempfile.mkstemp()
f = os.fdopen(fi, "w")
try:
f.write(res)
finally:
f.close()
Ответ 5
Если вы собираетесь писать в последнем примере, вам нужно:
with os.fdopen(tempfile.mkstemp()[0], 'w') as f:
f.write(res)