我发现自己无法在Python中打开新文件。当我用ls -l /proc/PID/fd
检查时,我看到为Python进程打开了大量文件。我正在使用的模块显然是打开了很多文件,而不是关闭它们。
我原以为我可以通过删除与打开文件的模块关联的对象来关闭文件,但什么也没发生。
我还希望在垃圾收集中的某处看到文件对象,但是我没有看到任何类似于打开文件的内容:
for obj in gc.get_objects():
if hasattr(obj, 'read'):
print(obj)
退出Python时文件消失了。
答案 0 :(得分:4)
问题很可能是那些文件描述符在没有与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
但是,这是一个非常邪恶的黑客。更好的解决方案是修复第三方库。