我发现Python自动关闭我的文件描述符。运行以下代码并使用lsof查找打开的文件。当sleep-in函数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)
我检查了class文件,它没有del\方法。很奇怪,有人知道吗?在
简而言之:是的。在
Python通过实现垃圾收集机制,使用户无需管理内存。 这基本上意味着如果没有人使用Python中的每个对象都将被自动释放和删除,以释放内存和资源,以便以后在程序中再次使用它们。在
文件对象是Python对象,与Python中的任何其他对象一样,它们也由垃圾回收器管理。一旦您离开函数作用域,垃圾回收器就会发现没有人使用该文件(使用引用计数器)并处理该对象—这意味着也会关闭该对象。在
要避免这种情况,可以使用
os.open
打开文件,而不使用Python文件对象,它返回文件描述符(int),而不是Python文件对象。文件描述符不会被垃圾回收器丢弃,因为它不是Python对象,而是一个操作系统对象,因此您的代码可以工作。 但是,您应该小心地稍后关闭(os.close
)fd,否则您将泄漏资源,您的程序迟早会崩溃(一个进程只能存储1024个文件描述符,然后无法打开更多的文件)!在附加信息:
{a1}
是的,CPython会的。在
当文件对象的引用计数降至0时,它们将自动关闭。正在清理的本地作用域意味着refcount将下降,如果本地作用域是唯一的引用,则文件对象refcount将下降到0并关闭。在
但是,最好将file对象用作
with
语句中的上下文管理器,并以这种方式自动关闭它;不要指望CPython的特定垃圾处理实现:注意,} slot 。^{} function 关闭file对象。在
__del__
是定制Python类的钩子;file对象是用C实现的,并填充^{如果要使文件对象保持打开状态更长时间,请确保仍有对它的引用。也可以在其他地方存储对它的引用。从函数中返回它并存储返回值,例如,将其设为全局变量,等等
相关问题 更多 >
编程相关推荐