Linux下Anaconda安装Spyder5启动依赖缺失相关问题咨询
问题1:该报错的根本原因是什么?
该报错的核心原因是Python包导入路径的优先级问题:
Linux下Python默认会优先加载用户家目录下~/.local/lib/python<对应版本>/site-packages路径下的包,优先级高于conda环境内的site-packages路径。你当前用户目录下安装了更高版本的jedi(0.18.0)和parso(0.8.2),Spyder启动时检测到的是优先加载的高版本包,和要求的版本不符,因此触发依赖报错。你用conda list查到的是conda环境内安装的正确版本包,但因为优先级更低没有被实际加载。
问题2:如果Python确实存在包缓存机制导致该问题,是不是违背了conda隔离环境的设计初衷?
这个现象本质不是包缓存问题,也没有违背conda的设计初衷:
conda隔离环境的核心设计目标是隔离不同conda环境之间的依赖、以及conda环境和系统全局Python安装的依赖。而~/.local下的用户级包是Python本身的设计,属于用户个人目录下的安装路径,conda默认没有主动屏蔽该路径的加载逻辑,二者属于不同层面的设计。如果需要完全的环境隔离,可以通过配置让conda屏蔽用户级包路径,这属于可配置的可选能力,不属于设计违背。
问题3:若缓存确实是问题根源,Linux系统下如何清除对应缓存,以及如何在切换不同conda环境时自动执行该操作?
临时解决当前报错
首先执行以下命令确认包加载路径:
python -c "import jedi, parso; print('jedi路径:', jedi.__file__); print('parso路径:', parso.__file__)"
如果输出的路径前缀为~/.local/lib/python,执行以下命令卸载用户目录下的高版本包即可:
pip uninstall jedi parso
永久避免该类问题
单个conda环境自动屏蔽用户级包
激活目标conda环境后执行以下命令,重新激活环境后生效:
conda env config vars set PYTHONNOUSERSITE=1
设置后该环境下Python不会加载~/.local下的所有包,完全使用conda环境内的依赖。
所有conda环境激活时自动屏蔽用户级包
- 在conda安装路径下的
etc/conda/activate.d/目录新建disable_user_site.sh,写入内容:
export PYTHONNOUSERSITE=1
- 在conda安装路径下的
etc/conda/deactivate.d/目录新建disable_user_site.sh,写入内容:
unset PYTHONNOUSERSITE
之后所有conda环境激活时都会自动屏蔽用户级包,退出环境时恢复默认设置。
内容的提问来源于stack exchange,提问作者user1159290

