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__方法。看起来很奇怪,有人知道吗?
是的,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()函数关闭文件对象。
如果您想将文件对象保持打开更长时间,请确保仍然存在对它的引用。也在其他地方存储对它的引用。例如,从函数返回它并存储返回值,或使其成为全局等。