如何跟踪Python中打开的文件/文件描述符的总数

2024-06-02 08:16:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在一堆寄存器上迭代的代码。它打开一些文件描述符,唯一的目的是使外部库触发的消息静音(anoying)。文件描述符是通过以下方式打开的:

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个,正如代码的其他部分所预期的那样)

问题(欢迎回答任何问题):

  1. 有没有其他更干净的方法让吵闹的外部图书馆安静下来
  2. 我是不是把文件描述符打开了?它应该由with子句关闭,对吗
  3. 关于如何在Python中跟踪泄漏的文件描述符,还有其他建议吗

Tags: 文件代码importoswithsys方式静音
1条回答
网友
1楼 · 发布于 2024-06-02 08:16:29

根据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

相关问题 更多 >