When/How 匿名文件对象是否关闭?

When/How does an anonymous file object close?

关于 python 一行的评论中,我突然想到我不知道 python 如何处理匿名文件对象。来自问题:

open(to_file, 'w').write(open(from_file).read())

有两次调用 open 没有使用 with 关键字(这通常是我处理文件的方式)。过去,我曾使用过这种未命名的文件。 IIRC,文件上似乎有一个剩余的 OS 级锁,该锁将在一两分钟后过期。

那么这些文件句柄会发生什么?他们被垃圾收集清理了吗?由OS?当 close() 被调用时 Python 机器和文件会发生什么,当脚本完成并经过一段时间后,这一切都会发生吗?

文件将在垃圾收集器收集后关闭,CPython 将立即收集它们,因为它使用引用计数,但这不是保证的行为。

如果您使用文件而不在循环中关闭它们,您可能 运行 没有文件描述符,这就是为什么建议使用 with 语句的原因(如果您使用的是 2.5,则可以使用 from __future__ import with_statement).

监控 Linux 上的文件描述符(通过检查 /proc/$$/fds)和 Windows 上的文件句柄(使用 SysInternals 工具),文件似乎在之后立即关闭声明。

但这不能保证,因为垃圾收集器必须执行。在我做过的测试中,它确实每次都会立即关闭。

with 语句建议与open 一起使用,但真正需要它的场合很少见。很难演示您 必须 使用 with 的场景,但为了安全起见可能是个好主意。

所以你的一行变成:

with open(to_file, 'w') as tof, open(from_file) as fof:
    tof.write(fof.read())

with 的优点是调用 __exit__() 的特殊方法(在 io class 中)保证*被调用。

* 除非你做类似 os._exit().

的事情