导入dask时因toolz依赖抛出AttributeError的修复问询
问题描述
执行以下Python命令时,触发依赖链路相关的长报错:
import dask
经定位,直接导入dask的依赖项tlz即可复现报错链路的深层问题,导入命令如下:
import tlz
完整报错追踪信息:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\dask\__init__.py", line 1, in <module> from dask import config, datasets File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\dask\datasets.py", line 3, in <module> from dask.utils import import_required File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\dask\utils.py", line 25, in <module> import tlz as toolz File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\tlz\__init__.py", line 9, in <module> from . import _build_tlz File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\tlz\_build_tlz.py", line 3, in <module> import toolz File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\__init__.py", line 20, in <module> from . import curried, sandbox File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\curried\__init__.py", line 27, in <module> from . import operator File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\curried\operator.py", line 14, in <module> {name: curry(f) if should_curry(f) else f File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\curried\operator.py", line 14, in <dictcomp> {name: curry(f) if should_curry(f) else f File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\curried\operator.py", line 9, in should_curry num = num_required_args(f) File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\functoolz.py", line 866, in num_required_args sigspec, rv = _check_sigspec(sigspec, func, _sigs._num_required_args, File "C:\Users\username\AppData\Local\Programs\Python\Python310\lib\site-packages\toolz\functoolz.py", line 827, in _check_sigspec sigspec = inspect.signature(func) AttributeError: module 'inspect' has no attribute 'signature'
报错原因
报错核心是运行时加载的inspect模块并非Python标准库自带版本:inspect.signature是Python 3.3及以上版本标准库inspect的内置方法,当前环境使用的Python 3.10原生支持该方法,出现属性不存在的错误通常由两类问题导致:
- 执行Python命令的工作目录下存在自定义命名为
inspect.py的文件、inspect.pyc缓存文件,或是名为inspect的自定义模块/文件夹,Python导入模块时优先检索当前工作目录,自定义的同名文件会覆盖标准库inspect tlz/toolz依赖安装过程中出现文件损坏、版本冲突,导致模块加载逻辑异常
修复方案
按以下优先级依次排查修复:
- 首先检查执行Python命令的当前目录,删除所有和标准库重名的
inspect相关自定义文件、文件夹,清理__pycache__缓存目录后重新执行导入命令,90%以上的同类问题都是该原因导致 - 若不存在文件名冲突,强制重装相关依赖修复损坏的安装文件,执行以下命令:
重装dask时会自动拉取版本匹配的tlz、toolz依赖,无需单独指定版本pip uninstall -y tlz toolz dask pip install --force-reinstall dask - 若上述操作无效,先在Python交互环境执行以下命令确认加载的inspect模块路径:
如果输出路径不是Python安装目录下的import inspect print(inspect.__file__)Lib/inspect.py,根据输出路径定位到冲突的第三方inspect模块删除即可;如果输出路径指向标准库文件但依然报错,说明Python环境的标准库文件损坏,覆盖安装对应版本的Python即可修复。
内容的提问来源于stack exchange,提问作者Isaacnfairplay
相关产品推荐
相关产品推荐

