繁体   English   中英

当我没有文件标识符时,如何在python中关闭文件

[英]How do I close files in python when I haven't got the file identifiers

我发现自己无法在Python中打开新文件。 当我用ls -l /proc/PID/fd检查时,我看到了为Python进程打开的大量文件。 我正在使用的模块显然打开了很多文件而没有关闭它们。

我期待通过删除与打开文件的模块相关联的对象来关闭文件,但没有任何反应。

我也期待在垃圾收集中的某处看到文件对象,但我没有看到任何类似于打开文件的内容:

for obj in gc.get_objects():
    if hasattr(obj, 'read'):
        print(obj)

退出Python时文件消失了。

问题很可能是那些文件描述符在没有与Python对象关联的情况下泄漏。 Python无法看到与Python对象无关的实际文件描述符(OS资源)。 如果它们与Python对象相关联,Python会在收集垃圾时关闭它们。 或者,第三方库自己跟踪文件描述符。

您可以在普通整数上使用os.close来关闭关联的文件描述符。 如果您知道要保持打开哪些文件描述符(通常是stdin / stdout / stderr,它们分别为0,1和2,可能还有其他几个),您可以关闭0到65535之间的所有其他整数,或者只是那些在/proc/<pid>/fd

import os

KEEP_FD = set([0, 1, 2])

for fd in os.listdir(os.path.join("/proc", str(os.getpid()), "fd")):
    if int(fd) not in KEEP_FD:
        try:
            os.close(int(fd))
        except OSError:
            pass

不过,这是一个非常邪恶的黑客。 更好的解决方案是修复第三方库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM