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

嵌入PySide2的Matplotlib退出时出现内存释放错误求助

解决Matplotlib切换PySide2后端后关闭窗口出现Fatal Python error: deallocating None的问题

我之前在把Matplotlib的PyQt5后端换成PySide2时,也碰到过完全一样的问题——正常关闭主窗口就弹出Fatal Python error: deallocating None的报错。看你修改的代码,和我当时的操作几乎一致:

原代码:

# Make sure that we are using QT5
matplotlib.use('Qt5Agg')
from PyQt5 import QtCore, QtWidgets

修改后:

# Make sure that we are using QT5
matplotlib.use('Qt5Agg')
matplotlib.rcParams['backend.qt5']='PySide2'
from PySide2 import QtCore, QtWidgets

这个错误的核心原因是Matplotlib和PySide2的资源释放顺序冲突,导致Python在清理对象时遇到了已被释放的空引用。这里有几个经过验证的解决办法,你可以挨个试试:

  • 显式控制资源释放流程:在程序退出前,先手动关闭所有Matplotlib图形窗口,再终止Qt应用实例。在你的主程序末尾添加这段代码:

    import matplotlib.pyplot as plt
    # 关闭所有Matplotlib窗口
    plt.close('all')
    # 退出Qt应用
    app = QtWidgets.QApplication.instance()
    if app is not None:
        app.quit()
    

    这样能确保Matplotlib的资源先被清理,再处理Qt的应用资源,避免交叉释放的问题。

  • 调整初始化顺序:把PySide2的导入放到Matplotlib后端设置之前。修改后的代码应该是这样:

    from PySide2 import QtCore, QtWidgets
    import matplotlib
    matplotlib.use('Qt5Agg')
    matplotlib.rcParams['backend.qt5'] = 'PySide2'
    

    让PySide2先完成自身的初始化,再让Matplotlib绑定对应的后端,能避免初始化阶段的资源绑定混乱。

  • 直接导入适配PySide2的后端模块:放弃手动修改rcParams,直接导入Matplotlib为PySide2准备的后端组件。比如:

    from PySide2 import QtCore, QtWidgets
    import matplotlib
    matplotlib.use('Qt5Agg')
    # 导入PySide2兼容的Matplotlib后端类
    from matplotlib.backends.backend_qt5agg import (
        FigureCanvasQTAgg as FigureCanvas,
        NavigationToolbar2QT as NavigationToolbar
    )
    

    这种方式会让Matplotlib自动适配PySide2的资源管理逻辑,减少手动配置带来的冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:15