如何跟踪Python中打开的文件/文件描述符的总数
我有一个在一堆寄存器上迭代的代码。它打开几个文件描述符,唯一的目的是使外部库触发的消息静音(隐藏)。文件描述符是通过以下方式打开的:如何跟踪Python中打开的文件/文件描述符的总数,python,python-3.x,file-descriptor,Python,Python 3.x,File Descriptor,我有一个在一堆寄存器上迭代的代码。它打开几个文件描述符,唯一的目的是使外部库触发的消息静音(隐藏)。文件描述符是通过以下方式打开的: 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 l
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个,正如代码其他部分所预期的那样)
问题(欢迎任何人回答):
根据Tavian Barnes提供的宝贵意见,我找到了一个解决方案,明确关闭了文件描述符,第一块代码变成:
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)
os.close(oldstderr_fno) # <-- new line that really closes the fd
del oldstderr_fno
导入系统
导入操作系统
...
将open(os.devnull,'w')作为devnull:
oldstderr_fno=os.dup(sys.stderr.fileno())
os.dup2(devnull.fileno(),2)
#这里我称之为嘈杂的外部图书馆
os.dup2(旧标准,2)
os.close(oldsterr_fno)#文件描述符只是
int
s,而del oldsterr_fno
不会关闭文件,您必须os.close()
it。不确定为什么open_files()
没有列出它。建议使用os。关闭。它解决了这个问题!非常感谢你!