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

时间:2016-07-29 13:51:44

标签: python file filesystems

this question关于python单行的评论中,我发现我不知道python如何处理匿名文件对象。从问题:

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

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

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

2 个答案:

答案 0 :(得分:4)

监控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类中)。

*除非您执行os._exit()

之类的操作

答案 1 :(得分:1)

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

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