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)