2012-05-29 3 views
5

는 다음 코드 테스트에 이것에 대해 질문이 있습니다 : 파일 개체가 닫혀파이썬에서 함수 스택 데이터를 언제 릴리스해야합니까?

def file_close_on_exc_test(): 
    f = open('/tmp/test', 'w+') 
    raise Exception() 

def exception_wrapper(): 
    try: 
     file_close_on_exc_test() 
    except: 
     pass 
    # wait to see whether file closed. 
    import time 
    time.sleep(10) 

if __name__ == '__main__': 
    exception_wrapper() 
    import time 
    time.sleep(30) 
  1. 1

    def file_close_test(): 
        f = open('/tmp/test', 'w+') 
    
    if __name__ == '__main__': 
        file_close_test() 
        # wait to see whether file closed. 
        import time 
        time.sleep(30) 
    

    2, 때 아무 때문에 file_close_test 종료 그것을 참조하십시오.

  2. 예외가 제기 된 후에는 파일 객체가 닫히지 않았습니다. 따라서 관련 스택 데이터가 해제되지 않았다고 생각합니다.
  3. exception_wrapper 종료 후 파일이 자동으로 닫힙니다.

나를 설명 할 수 있습니까? 감사.

답변

3

예외에는 예외가 발생했을 때 활성화 된 스택 프레임의 모든 로컬 변수에 액세스하는 데 사용할 수있는 추적 객체가 포함됩니다. 즉, 예외 컨텍스트가 지워질 때까지 파일에 계속 액세스 할 수 있습니다.

에도 exception_wrapper의 말에 sleep() 후이 같은 열린 파일에서 얻을 수 sys.exc_info을 사용할 수

tb = sys.exc_info()[2] 
print tb.tb_next.tb_frame.f_locals['f'] 

이 모든

은 물론 사용중인 특정 파이썬 구현에 따라 다릅니다. 다른 구현은 가비지 수집 될 때까지 암시 적으로 파일을 닫지 않을 수 있습니다.

결론은 오픈 파일과 같은 리소스를 정리하기 위해 파이썬의 참조 카운팅 또는 가비지 수집에 의존해서는 안되며 항상 명시 적으로 수행해야합니다.

+1

또한 열심히 : '열기 ('/ tmp/test ','w + ') f :' –

+0

그것은 나를 많이 도와줍니다, 감사합니다 :) – yancl

관련 문제