如何关闭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
相关产品推荐
相关产品推荐

