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()
.
的事情
在
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()
.