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)
Ответ 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)