Python文件句柄泄漏主因是打开后未关闭,导致“Too many open files”错误;常见于遗漏close()、异常中断执行流、多文件操作中清理失败及提前退出;推荐统一使用with语句确保自动关闭。
Python 文件句柄泄漏通常是因为打开文件后未正确关闭,导致操作系统持有的文件描述符无法释放。只要进程还在运行,这些未关闭的句柄就会持续占用系统资源,最终可能触发“Too many open files”错误。
直接使用 open() 打开文件,但没配对调用 close(),句柄就一直挂着:
f = open('data.txt'); content = f.read() —— 后面忘了 f.close()
try...finally,但如果在 open() 后立刻抛异常(比如路径不存在),f 可能根本没成功赋值,finally 里又没做判空,反而引发新错
在处理多个文件或嵌套操作时,中间某步出错,后续的 close() 就不会执行:
f1 = open('a.txt'); f2 = open('b.txt'); process(f1, f2); f1.close(); f2.close() —— 如果 process() 抛异常,两者的 close() 都被跳过return、break 或 sys.exit() 提前退出函数,也容易绕过清理代码在 for 循环或 while 中不断 open(),尤其配合条件判断或 continue,极易遗漏关闭:
for name in filenames: f = open(name); do_something(f); # 忘了 close它能确保无论是否发生异常、是否提前返回,文件都会被自动关闭:
with open('data.txt') as f: content = f.read() —— 缩进结束即关闭with open('a') as a, open('b') as b:
try/finally 并检查对象是否存在不复杂但容易忽略:句柄泄漏往往不是大段代码的问题,而是某一行少写了 close,或一个异常路径没覆盖到。