2009-02-22 11 views
14

나는 항상이 폐쇄되지 않고 연 경우 파일이 누출 된 것으로 가정했지만, 난 그냥 코드의 다음 줄을 입력하면, 파일이 종료됩니다 것을 확인 :어떻게 파이썬은 gc 된 파일을 닫습니까?

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

을 그냥 단순한 호기심에서 , 어떻게 작동합니까? 파일에 __ del __ 메소드가 포함되어 있지 않습니다.

답변

19

CPython에서 적어도 파일 객체가 할당 해제되면 파일이 닫힙니다. CPython 소스의 Objects/fileobject.c에있는 file_dealloc 함수를 참조하십시오. Dealloc 메서드는 __del__의 고유 한 문제가없는 경우를 제외하고 C 유형의 경우 __del__과 비슷합니다.

+1

명확히하기 위해 __del__은 가비지 수집 중에 호출되며 파일 객체에 대한 참조가 더 이상 없을 때 발생하는 파일 객체에 대한 Python의 C 구현에서 호출됩니다. –

4

따라서 입니다. 파이썬 2.5

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. 
+0

그게 내가 생각한 것입니다. 그러나 Python 2.5.1의 OS X에서는 내가 게시 한 코드 라인이 파이썬 해석기로 하여금 파일을 해제하도록합니다 (Activity Monitor에서 검증 됨). –

+0

파이썬은 파일을 수집 할 때 파일을 닫아야합니다. 나는 이것이 fileobject.c에서 어디에서 발생했는지를 조사해 왔지만, 거기에는 없다. 아마도 어쩌면 GC 메커니즘에있을 것입니다. 이것은 내가 다음에보고있는 곳입니다. 나는이 질문을 좋아한다. –

+0

나는 fileobject.c에서 그것을 놓친 것처럼 보입니다 (Gallagher를보십시오). CPython 내부에 대해 더 잘 이해하고 싶습니다. –

0

추측이다 (파이썬 2.6 또는 3.x를 들어, 아무것도하지 않고)

from __future__ import with_statement 

를 사용하는 파일 형식이기 때문에 내장 타입, 인터프리터는 가비지 콜렉션에서 파일 닫기를 처리합니다.

또는 파이썬 인터프리터가 종료 된 후에 만 ​​확인하고 모든 "누수 된"파일 핸들은 어쨌든 닫힙니다.

+0

"원시 타입"(Java로부터받은)에 대한 내 이해는 파일을 원시로 남겨 두지 않습니다. 왜냐하면 파이썬에는 원시 타입이 없기 때문입니다. –

+1

나는 HUAGHAGUAH가 "built-in type"을 의미한다고 생각합니다. :) –

2

파이썬은 가비지 수집 외에 참조 계산과 결정론적인 파괴를 사용합니다. 개체에 대한 참조가 더 이상 없으면 개체가 즉시 해제됩니다. 파일을 해제하면 파일이 닫힙니다.

이것은 예 : Java는 비 결정적 가비지 콜렉션 만있는 곳입니다. 즉, 객체가 해제 된 시점을 알기 때문에 수동으로 파일을 닫아야합니다.

참조 계산이 완벽하지는 않습니다. 프로 그램에서 도달 할 수없는 순환 참조가있는 객체를 가질 수 있습니다. 그래서 파이썬은 레퍼런스 카운팅 외에도 가비지 콜렉션을 가지고있다.