python - 检测 python 中的文件句柄泄漏?

标签 python file handle

我的程序似乎正在泄漏文件句柄。我怎样才能找到位置?

我的程序在几个不同的地方使用文件句柄——子进程的输出,调用 ctypes API (ImageMagick) 打开文件,然后复制它们。

它在 shutil.copyfile 中崩溃,但我很确定这不是它泄漏的地方。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 874, in main
    magpy.run_all()
  File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 656, in run_all
    [operation.operate() for operation in operations]
  File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 417, in operate
    output_file = self.place_image(output_file)
  File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 336, in place_image
    shutil.copyfile(str(input_file), str(self.full_filename))
  File "C:\Python25\Lib\shutil.py", line 47, in copyfile
    fdst = open(dst, 'wb')
IOError: [Errno 24] Too many open files: 'C:\\Documents and Settings\\stuart.axon\\Desktop\\calzone\\output\\wwtbam4\\Nokia_NCD\\nl\\icon_42x42_V000.png'
Press any key to continue . . .

最佳答案

我遇到了类似的问题,在 subprocess.Popen() 调用期间用完了文件描述符。我使用以下脚本来调试正在发生的事情:

import os
import stat

_fd_types = (
    ('REG', stat.S_ISREG),
    ('FIFO', stat.S_ISFIFO),
    ('DIR', stat.S_ISDIR),
    ('CHR', stat.S_ISCHR),
    ('BLK', stat.S_ISBLK),
    ('LNK', stat.S_ISLNK),
    ('SOCK', stat.S_ISSOCK)
)

def fd_table_status():
    result = []
    for fd in range(100):
        try:
            s = os.fstat(fd)
        except:
            continue
        for fd_type, func in _fd_types:
            if func(s.st_mode):
                break
        else:
            fd_type = str(s.st_mode)
        result.append((fd, fd_type))
    return result

def fd_table_status_logify(fd_table_result):
    return ('Open file handles: ' +
            ', '.join(['{0}: {1}'.format(*i) for i in fd_table_result]))

def fd_table_status_str():
    return fd_table_status_logify(fd_table_status())

if __name__=='__main__':
    print fd_table_status_str()

您可以导入此模块并调用 fd_table_status_str() 以记录代码中不同位置的文件描述符表状态。

另外,确保 subprocess.Popen 实例被销毁。在 Windows 中保留 Popen 实例的引用会阻止 GC 运行。如果保留实例,则不会关闭关联的管道。更多信息 here .

关于python - 检测 python 中的文件句柄泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/561988/

相关文章:

java - 短 c#'s alternative to Java' s Path.ResolveSibling。不可能吗?

python - 函数返回字符串错误

python - 电子前沿基金会的猫笑话

python - 验证列表索引时,是事先检查有效性还是捕获并处理 IndexError 更好?

c# - 为什么在 main() 退出之前调用 Dispose()?

c++ - 如何将整数句柄转换为 HWND

R - curl - 仅在更改时下载远程文件

python - PyInstaller 不工作 Python 3.5

java - Liferay 从文件入口到 java 文件对象

.net - 如何在不丢失奇数字符的情况下读取文本文件?