当没有任何内容引用它时,open()ed 文件是否会被关闭?

问题描述 投票:0回答:1

我知道打开文件的安全且推荐的方法是使用上下文管理器:

with open("x") as fh:
    do_something_with(fh)

我经常遇到这样的情况,除了完全读取或写入文件然后关闭它之外,我不想对

open()
返回的文件句柄执行任何操作。关闭文件由上下文管理器自动处理。但如果我不使用怎么办?

比如说是这个吗

with open("x.pickle", "rb") as fh:
    foo = pickle.load(fh)
more_code()

或多或少相当于这个?

foo = pickle.load(open("x.pickle", "rb"))
more_code()

假设pickle(或任何其他创建/使用文件的东西)没有以某种方式保留文件句柄,并让它超出范围,它最终应该被垃圾收集并关闭文件,对吗?

我通过在

sleep(100000)
之前插入
more_code()
来测试这个简单的示例,然后检查
lsof
以查看文件是否仍显示为打开状态。在本次测试中,情况并非如此。因此,再次假设无论读/写文件都会让文件句柄超出范围,这是一种安全的做法吗?

python file-io memory-leaks garbage-collection contextmanager
1个回答
1
投票

iobase 的 Python 实现中,您可以看到 IO 对象的垃圾收集 (

finalize
) 部分正在调用其
close
方法,并将属性
_finalizing
设置为 True。这个类是
TextIOBase
的超类。

当然,请注意,这是一个低级实现细节。我怀疑 Python 文档是否要求这样做。

© www.soinside.com 2019 - 2024. All rights reserved.