先导入ruamel.yaml再用qtpy替代PySide6引发RuntimeWarning求助
ruamel.yaml 导入顺序引发 QtPy + PySide6 运行时警告的问题
问题复现
若在导入Qt类前先导入ruamel.yaml(即使未实际使用),将PySide6原生导入替换为QtPy后会触发大量RuntimeWarning。以下脚本可复现该问题:
import sys from ruamel.yaml import YAML as rYAML # 关键:该导入在QtPy之前 from qtpy.QtWidgets import QApplication, QLabel # 创建应用与部件 app = QApplication(sys.argv) label = QLabel("Hello World!") label.resize(400, 200) label.show() sys.exit(app.exec())
警告现象
运行后会输出类似如下的RuntimeWarning:
shibokensupport/signature/parser.py:265: RuntimeWarning: pyside_type_init:_resolve_value UNRECOGNIZED: 'PySide6.QtWidgets.QFileDialog.ViewMode' OFFENDING LINE: 'PySide6.QtWidgets.QFileDialog.viewMode(self)->PySide6.QtWidgets.QFileDialog.ViewMode'
当前环境版本
- ruamel.yaml 0.19.1
- qtpy 2.4.3
- PySide6 6.11.0
解决办法
1. 调整导入顺序(推荐)
将QtPy/PySide6相关导入移至ruamel.yaml之前,让PySide6先完成类型解析初始化,避免被ruamel.yaml的导入钩子干扰:
import sys from qtpy.QtWidgets import QApplication, QLabel from ruamel.yaml import YAML as rYAML # 移至Qt导入之后 app = QApplication(sys.argv) label = QLabel("Hello World!") label.resize(400, 200) label.show() sys.exit(app.exec())
2. 升级依赖版本
检查并升级ruamel.yaml或QtPy至最新稳定版,新版本可能已修复此类兼容性冲突:
- 尝试升级ruamel.yaml到0.19.2及以上版本
- 尝试升级QtPy到2.5.0及以上版本
3. 预加载PySide6类型解析模块(临时方案)
若无法调整导入顺序,可在导入ruamel.yaml前先预加载shibokensupport模块,触发PySide6的类型初始化:
import sys # 预加载PySide6类型解析依赖 import shibokensupport.signature.parser from ruamel.yaml import YAML as rYAML from qtpy.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hello World!") label.resize(400, 200) label.show() sys.exit(app.exec())
问题原因
ruamel.yaml在导入过程中会修改Python的导入钩子或类型注解解析逻辑,而PySide6的shibokensupport模块在解析Qt类的函数签名时依赖原生的类型解析流程。QtPy作为跨Qt框架兼容层,在转发导入时会触发这一未被ruamel.yaml兼容的解析步骤,导致签名解析失败并抛出警告。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

