【发布时间】:2019-11-28 21:55:23
【问题描述】:
我有一个迭代一堆寄存器的代码。它打开一些文件描述符,唯一目的是消除由外部库触发的消息。文件描述符的打开方式:
import sys
import os
...
with open(os.devnull, 'w') as devnull:
oldstderr_fno = os.dup(sys.stderr.fileno())
os.dup2(devnull.fileno(), 2)
# here I call the noisy external library
os.dup2(oldstderr_fno, 2)
del oldstderr_fno
如果迭代次数很少,代码运行良好。当我尝试遍历整个数据集时,我最终得到了错误:
OSError: [Errno 24] Too many open files
我怀疑该错误来自我对外部库调用进行静音的方式。
我试图通过以下输出来跟踪我未能关闭文件描述符的位置:
import psutil
open_fd = len(psutil.Process().open_files())
print("Open FDs: %d" % open_fd)
但是报告的打开文件的数量是恒定的(只有 2 个,正如代码的其他部分所预期的那样)。
问题(非常欢迎任何答案):
- 还有其他更简洁的方法可以使嘈杂的外部库静音吗?
- 我是否打开了一些文件描述符?它应该被 with 子句关闭,对吧?
- 关于如何在 Python 中跟踪泄漏的文件描述符还有其他建议吗?
【问题讨论】:
-
文件描述符只是
ints 和del oldstderr_fno不会关闭文件,你必须os.close()它。不知道为什么open_files()没有列出它。 -
os.close的好建议。它解决了这个问题!非常感谢!
标签: python python-3.x file-descriptor