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

标签 python file

我发现自己无法在 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

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

关于python - 当我没有文件标识符时,如何在 python 中关闭文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25944211/

相关文章:

python - 类似于 zip() 的内置函数,用 None 值从左边填充不等长度

python - 如何 : Redis in production server

python - 如何将字符串转换为数组并将数组中的每个十六进制值转换为python中的十进制?

python - 永远在 python 中运行计时器

windows - 强制 Windows *现在*更新文件访问时间的方法?

Java 固定长度随机存取文件

python - 如何在 index.html 页面上显示版本信息

python - 文件中字符最多的行?

C++ ifstream 对象 "reseting"

java - 使用 Java 重新排列文件数组内容