如果 fd 超出本地范围,Python 会关闭它吗?

qiu*_*fei 2 python file file-descriptor

我发现 Python 会自动关闭我的文件描述符。运行以下代码并使用lsof查找打开的文件。当 sleep in function 时openAndSleep,我发现文件“fff”被进程保存。但是当它用完该功能时,文件“fff”不再保留。

import time

def openAndSleep():
    f = open("fff", 'w')
    print "opened, sleep 10 sec"
    time.sleep(10)
    print "sleep finish"

openAndSleep()
print "in main...."
time.sleep(10000)
Run Code Online (Sandbox Code Playgroud)

我检查类文件,它没有__del__方法。看起来很奇怪,有人知道吗?

Mar*_*ers 5

是的,CPython 会。

当它们的引用计数下降到 0 时,文件对象会自动关闭。被清理的本地范围意味着引用计数下降,如果本地范围是唯一的引用,那么文件对象引用计数下降到 0 并关闭。

但是,最好将文件对象用作with语句中的上下文管理器并以这种方式自动关闭;不要指望 CPython 的特定垃圾处理实现:

def openAndSleep():
    with open("fff", 'w') as f:
        print "opened, sleep 10 sec"
        time.sleep(10)
        print "sleep finish"
Run Code Online (Sandbox Code Playgroud)

请注意,这__del__是自定义 Python 类的钩子;文件对象在 C 中实现并填充tp_dealloc插槽。该file_dealloc()函数关闭文件对象。

如果您想将文件对象保持打开更长时间,请确保仍然存在对它的引用。也在其他地方存储对它的引用。例如,从函数返回它并存储返回值,或使其成为全局等。