Pytest运行时导入matplotlib.backends.backend_qt5agg报错求助
解决pytest中导入matplotlib.backends.backend_qt5agg时的TypeError问题
在运行pytest测试时,导入matplotlib.backends.backend_qt5agg出现TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier',但正常运行应用时无此问题,使用版本为matplotlib 3.6.0 + PyQt5。以下是可行的解决方案:
方案1:延迟导入matplotlib模块
将matplotlib的导入逻辑移到测试函数内部,确保Qt环境初始化完成后再加载模块:
from PyQt5 import QtCore, QtGui, QtTest, QtWidgets from PyQt5.QtCore import QCoreApplication, QObject, Qt from PyQt5.QtWidgets import * from pytestqt.plugin import QtBot def test_method(qtbot): # 延迟导入,避免模块初始化时的Qt环境问题 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas # 后续测试代码 ...
方案2:提前初始化Qt应用并指定matplotlib后端
在测试文件开头添加代码,确保Qt应用实例存在,并明确指定matplotlib的后端:
import matplotlib # 强制指定Qt5Agg后端 matplotlib.use('Qt5Agg') from PyQt5 import QtCore, QtGui, QtTest, QtWidgets from PyQt5.QtCore import QCoreApplication, QObject, Qt from PyQt5.QtWidgets import * from pytestqt.plugin import QtBot from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas # 确保Qt应用已初始化 app = QCoreApplication.instance() if app is None: app = QtWidgets.QApplication([]) def test_method(qtbot): # 测试代码 ...
方案3:调整matplotlib版本
该问题是matplotlib 3.6.x版本与PyQt5在pytest环境下的已知兼容性bug,可通过版本调整解决:
- 升级到matplotlib 3.7.0及以上版本,官方已修复此Qt后端初始化问题
- 或降级到matplotlib 3.5.x版本,避开bug区间
执行升级命令:
pip install --upgrade matplotlib>=3.7.0
执行降级命令:
pip install matplotlib==3.5.3
方案4:临时修改matplotlib源码
若无法调整版本,可手动修改matplotlib安装目录下的backend_qt.py文件:
找到报错的_MODIFIER_KEYS定义段(对应文件第72-73行),替换为以下代码:
_MODIFIER_KEYS = [ (int(QtCore.Qt.KeyboardModifier.ShiftModifier), "shift"), (int(QtCore.Qt.KeyboardModifier.ControlModifier), "control"), (int(QtCore.Qt.KeyboardModifier.AltModifier), "alt"), (int(QtCore.Qt.KeyboardModifier.MetaModifier), "meta"), (int(QtCore.Qt.KeyboardModifier.KeypadModifier), "keypad"), ]
直接调用Qt枚举值的int转换,绕开原代码中_enum函数导致的类型错误。
内容的提问来源于stack exchange,提问作者MOHAMED AZARUDEEN
相关产品推荐
相关产品推荐

