【笔记】修复AttributeError: ‘super‘ object has no attribute ‘__del__‘
#工作记录
一、问题描述
部署人工智能Qlib量化投资平台-CSDN博客
在运行微软开源量化投资Qlib项目结束时程序报以下错误:
Traceback (most recent call last):
File "F:\PythonProjects\qlib\.venv\Lib\site-packages\joblib\externals\loky\backend\resource_tracker.py", line 181, in __del__
AttributeError: 'super' object has no attribute '__del__'
根据以上错误信息,AttributeError: 'super' object has no attribute '__del__'
是由于在 joblib
的 resource_tracker.py
文件中,某个类的 __del__
方法错误地调用了 super().__del__()
,而基类可能未定义 __del__
方法导致的。
以下是可能的原因和解决方案:
二、原因分析
-
__del__
方法调用问题
Python 的__del__
方法在对象被垃圾回收时调用,但若基类未定义__del__
,而子类尝试通过super().__del__()
调用父类的析构函数,就会触发此错误。 -
模块导入问题
如果resource_tracker.py
中在__del__
方法内动态导入了模块(如import os
),而解释器关闭时模块已被卸载,也可能导致类似错误。 -
joblib
版本兼容性
旧版本的joblib
可能存在资源管理逻辑的缺陷,尤其是在多进程或并行计算场景下。
三、修复方法
步骤 1:确认当前安装的 joblib
版本
通过以下命令查看已安装的版本:
pip show joblib
输出示例:
(base) (.venv) PS F:\PythonProjects\qlib\examples> pip show joblib
Name: joblib
Version: 1.5.0
Summary: Lightweight pipelining with Python functions
Home-page: https://joblib.readthedocs.io
Author:
Author-email: Gael Varoquaux <gael.varoquaux@normalesup.org>
License: BSD 3-Clause
Location: F:\PythonProjects\qlib\.venv\Lib\site-packages
Requires:
Required-by: osqp, pyqlib, scikit-learn
(base) (.venv) PS F:\PythonProjects\qlib\examples>
可以看到当前安装的是1.5.0版本。
此步骤可快速定位当前版本,避免因版本混淆导致的问题。
步骤 2:查询所有可用版本
若需测试或修复版本兼容性问题,可通过以下方式查询所有可用版本:
#指定一个根本不存在的版本,假意进行安装,以从报错输出中查询全部可用版本
pip install joblib==9.9.9
【笔记】Python 开发必备:无需跳转,pip 快速获取包版本的技巧-CSDN博客
- 作用:模拟安装过程,列出所有可用的版本号(即使目标版本不存在)。
PowerShell 7.6.0-preview.4
(base) (.venv) PS F:\PythonProjects\qlib> pip install joblib==9.9.9
ERROR: Could not find a version that satisfies the requirement joblib==9.9.9 (from versions: 0.1a0.dev0, 0.2a0.dev0, 0.3a0.dev0, 0.3.1a0.dev0, 0.3.2.dev0, 0.3.2a0.dev0, 0.3.2b0.dev0, 0.3.2rc0.dev0, 0.3.3a0.dev0, 0.3.3b0.dev0, 0.3.3rc0.dev0, 0.3.4.dev0, 0.3.5.dev0, 0.3.6.dev0, 0.3.7.dev0, 0.4.0.dev0, 0.4.1.dev0, 0.4.2.dev0, 0.4.3.dev0, 0.4.4.dev0, 0.4.5.dev0, 0.4.6.dev0, 0.5.0.dev0, 0.5.0a0.dev0, 0.5.1.dev0, 0.5.2.dev0, 0.5.3.dev0, 0.5.4.dev0, 0.5.5.dev0, 0.5.6.dev0, 0.5.7.dev0, 0.5.7a0.dev0, 0.5.7b0.dev0, 0.5.7, 0.6.0a0, 0.6.0b0, 0.6.0b2, 0.6.0b3, 0.6.0, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.7.0a0, 0.7.0b0, 0.7.0rc0, 0.7.1, 0.8.0a0, 0.8.0a2, 0.8.0a3, 0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.3.post1, 0.8.4, 0.9.0b2, 0.9.0b3, 0.9.0b4, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.10.0, 0.10.2, 0.10.3, 0.11a3, 0.11, 0.12.0, 0.12.1, 0.12.2, 0.12.3, 0.12.4, 0.12.5, 0.13.0, 0.13.1, 0.13.2, 0.14.0, 0.14.1, 0.15.0, 0.15.1, 0.16.0, 0.17.0, 1.0.0, 1.0.1, 1.1.0a0, 1.1.0, 1.1.1, 1.2.0, 1.3.0, 1.3.1, 1.3.2, 1.4.0, 1.4.2, 1.5.0)
ERROR: No matching distribution found for joblib==9.9.9
从输出中可以看到,可用的最新版本是1.5.0版,也就是我当前已经安装过的版本,最临近的版本是1.4.2版(较低版本)。
步骤 3:升级或降级到临近版本
升级到最新版
pip install --upgrade joblib
- 适用场景:当前安装的版本号低于最新版时,需要新功能或修复已知问题。
- 验证(python环境下):
import joblib print(joblib.__version__) # 确认版本已更新
降级到临近版本
若当前已安装最新版本(1.5.0)却有此报错,可降级到已知的最临近版本(上个版本是1.4.2):
pip install joblib==1.4.2
- 选择依据:根据 PyPI 历史记录,
1.4.2
是最后一个支持 Python 3.7+ 的稳定版本。 - 验证:运行原代码,观察是否修复错误。
可以看到,在重新运行微软开源量化投资Qlib项目结束时,项目已经正常运行,本文开头的报错已消除(修复)。
步骤 4:版本选择建议
版本范围 | 特点 | 适用场景 |
---|---|---|
1.5.0+ | 最新版,支持并行计算优化、内存映射等新特性 | 需要最新功能的项目 |
1.4.x | 稳定版,兼容 Python 3.7+,无重大兼容性问题 | 生产环境或依赖旧 API 的项目 |
<1.3.0 | 旧版,可能缺少性能优化,需谨慎使用 | 遗留系统维护 |
总结
- 优先升级:若项目允许,升级到最新版以获取性能改进和安全修复。
- 降级备用:若遇到兼容性问题,选择已验证的稳定版本(如
1.4.2
)。 - 环境隔离:使用虚拟环境避免全局依赖冲突。
通过合理管理 joblib
版本,可有效规避因 API 变更或资源管理缺陷导致的错误。