Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跟踪Python中打开的文件/文件描述符的总数_Python_Python 3.x_File Descriptor - Fatal编程技术网

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

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

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

  • 根据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。关闭
    。它解决了这个问题!非常感谢你!