我对测试以下代码有疑问:
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)
答案 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的引用计数或垃圾收集来清理像打开文件这样的资源,总是明确地这样做。