You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关闭Matplotlib测试图像,解决Pytest内存不足警告?

解决pytest mpl_image_compare内存不足的图像清理方案

嘿,碰到这种因为大量测试图像没释放导致的内存警告,确实挺头疼的,尤其是代码架构没法直接调用fig.close()的情况。给你几个实用的方案,应该能解决问题:

方案1:全局自动清理的pytest Fixture

这个方案最省心,不需要改现有测试代码,只需要在你的测试目录下创建一个conftest.py文件,添加以下fixture:

import pytest
import matplotlib.pyplot as plt

@pytest.fixture(autouse=True)
def auto_cleanup_matplotlib_figures():
    # 先执行测试代码
    yield
    # 测试完成后,关闭所有matplotlib生成的figure
    plt.close('all')

autouse=True会让这个fixture自动作用于所有测试用例,不管你的测试里有没有显式引用figure对象,测试结束后都会强制关闭所有图像资源,完美绕过代码架构的限制。

方案2:利用mpl_image_compare自带的清理参数

其实mpl_image_compare装饰器本身就有图像清理的参数,你可以直接在装饰器里添加clear_figure=True,让装饰器自己处理图像关闭:

@pytest.mark.mpl_image_compare(
    baseline_dir='baseline',
    filename='file.png',
    style='style_guidline',
    clear_figure=True,  # 开启自动清理
    savefig_kwargs={'bbox_inches': 'tight'}
)
def test_my_image():
    # 你的测试代码,无需手动关闭fig
    ...

这个参数会在图像对比完成后,自动清理当前测试生成的figure,比手动调用fig.close()更可靠,因为它是在装饰器的内部逻辑里执行的,不受你代码架构的影响。

方案3:极端情况的强制重置(不推荐优先用)

如果上面两个方案都没效果,可能是matplotlib的资源缓存有残留,你可以试试强制重置后端来彻底清理:

import pytest
import matplotlib
import matplotlib.pyplot as plt

@pytest.fixture(autouse=True)
def hard_reset_matplotlib():
    yield
    # 先清理所有figure
    plt.clf()
    plt.close('all')
    # 重置matplotlib后端
    matplotlib.use('Agg')

这个方案比较激进,适合其他方法都无效的场景,因为重置后端会清空所有matplotlib的全局状态。

这些方案都不需要你在测试代码里手动操作figure对象,应该能完美适配你的架构限制,解决内存不足的问题。

内容的提问来源于stack exchange,提问作者Stephen Strosko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:03:02