什么时候在python中发布函数堆栈数据?

时间:2012-05-29 10:43:56

标签: python stackframe

我对测试以下代码有疑问:

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,

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. file_close_test 退出时文件对象已关闭,因为没有引用它。
  2. 引发异常后,文件对象未关闭。所以我认为相关的堆栈数据没有被释放。
  3. exception_wrapper 退出后,文件自动关闭。
  4. 你可以帮我解释一下吗?感谢。

1 个答案:

答案 0 :(得分:3)

该异常包括一个traceback对象,可用于访问抛出异常时活动的任何堆栈帧中的所有局部变量。这意味着您仍然可以访问该文件,直到清除异常上下文。

即使在sleep()结尾处的exception_wrapper之后,您也可以使用sys.exc_info来获取这样的打开文件:

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

所有这些当然特定于您正在使用的特定Python实现。其他实现可能根本不会隐式关闭文件,直到它们被垃圾回收。

最重要的是,你不应该依赖Python的引用计数或垃圾收集来清理像打开文件这样的资源,总是明确地这样做。