匿名文件对象何时/如何关闭?

Wil*_*ill 5 python filesystems file

这个关于 python one-liner 的问题的评论中,我突然想到我不知道 python 如何处理匿名文件对象。从问题:

open(to_file, 'w').write(open(from_file).read())
Run Code Online (Sandbox Code Playgroud)

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

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

cda*_*rke 5

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

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

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

所以你的单线变成:

with open(to_file, 'w') as tof, open(from_file) as fof:
    tof.write(fof.read())
Run Code Online (Sandbox Code Playgroud)

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

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