python: нужно закрыть файл из mkstemp, если я использую fdopen? - PullRequest
11 голосов
/ 18 октября 2011

Что из следующего является более правильным?

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()

Ответы [ 5 ]

6 голосов
/ 18 октября 2011

Отметьте 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
3 голосов
/ 18 октября 2011

Если на достаточно позднем Python вы можете сыграть в гольф до:

with os.fdopen(tempfile.mkstemp()[0]) as f:
    f.write(res)
2 голосов
/ 21 июля 2013

Продолжаем следить за последними ответами, если вам нужен путь:

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)
1 голос
/ 18 октября 2011

Я бы сделал:

fi, path = tempfile.mkstemp()
f = os.fdopen(fi, "w")
try:
  f.write(res)
finally:
  f.close()
0 голосов
/ 17 декабря 2012

Если вы собираетесь писать в последнем примере, вам понадобится:

with os.fdopen(tempfile.mkstemp()[0], 'w') as f:
     f.write(res)
...