Как python закрывает файлы, которые были скопированы? - PullRequest
15 голосов
/ 22 февраля 2009

Я всегда предполагал, что файл будет иметь утечку, если он был открыт без закрытия, но я просто убедился, что если я введу следующие строки кода, файл закроется:

>>> f = open('somefile.txt')
>>> del f

Просто из чистого любопытства, как это работает? Я заметил, что файл не содержит __ del __ метод.

Ответы [ 4 ]

20 голосов
/ 22 февраля 2009

В CPython, по крайней мере, файлы закрываются, когда файловый объект освобождается. См. Функцию file_dealloc в Objects/fileobject.c в исходном коде CPython. Методы Dealloc подобны __del__ для типов C, за исключением того, что некоторые проблемы, присущие __del__.

, отсутствуют.
4 голосов
/ 22 февраля 2009

Отсюда с оператором.

Для Python 2.5 используйте

from __future__ import with_statement

(для Python 2.6 или 3.x ничего не делать)

with open( "someFile", "rU" ) as aFile:
    # process the file
    pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.
3 голосов
/ 22 февраля 2009

Python использует подсчет ссылок и детерминированное уничтожение в дополнение к сборке мусора. Когда больше нет ссылок на объект, объект немедленно освобождается. Выпуск файла закрывает его.

Это отличается, например, от Java, где есть только недетерминированная сборка мусора. Это означает, что вы не знаете, когда объект будет освобожден, поэтому вам придется закрыть файл вручную.

Обратите внимание, что подсчет ссылок не идеален. Вы можете иметь объекты с круговыми ссылками, которые недоступны из программы. Вот почему в Python есть сборщик мусора в дополнение к подсчету ссылок.

0 голосов
/ 22 февраля 2009

Лучше всего предположить, что поскольку тип файла является встроенным, интерпретатор сам выполняет закрытие файла при сборке мусора.

В качестве альтернативы, вы проверяете только после того, как интерпретатор Python завершил работу, и все «утечка» файловых дескрипторов в любом случае закрыта.

...