
当在不同机器上复用同一 Conda 环境时,import scipy; print(scipy.__version__) 可能返回与 conda list 显示不符的版本(如显示 1.13.1 而非环境声明的 1.12.0),根本原因在于 Python 优先加载了用户本地站点包(~/.local/lib/python3.9/site-packages/)中的 SciPy,而非 Conda 环境内的版本。
当在不同机器上复用同一 conda 环境时,`import scipy; print(scipy.__version__)` 可能返回与 `conda list` 显示不符的版本(如显示 1.13.1 而非环境声明的 1.12.0),根本原因在于 python 优先加载了用户本地站点包(`~/.local/lib/python3.9/site-packages/`)中的 scipy,而非 conda 环境内的版本。
该问题虽表面表现为“环境不一致”,实则源于 Python 的模块搜索路径机制:默认情况下,Python 会按以下顺序查找包:
- 当前脚本所在目录
-
PYTHONPATH指定路径 -
用户站点目录(
site.USER_SITE,如~/.local/lib/python3.9/site-packages/) - Conda 环境的
site-packages - 标准库路径
由于用户站点目录(由 pip install --user 或历史残留安装产生)在搜索顺序中早于 Conda 环境路径,若其中存在旧版 SciPy(例如 1.13.1),即使 conda list 显示环境已安装 1.12.0,运行时仍会加载用户目录下的版本——这正是 scipy.__version__ 与预期不符的直接原因。
⚠️ 特别注意:该问题在 JAX 场景下尤为敏感。JAX(尤其是旧版本如
0.2.19)对 SciPy 版本有隐式依赖,若加载了不兼容的本地 SciPy(如 1.13.1),可能导致数值计算异常、函数签名不匹配或静默降级行为。
解决方案(推荐两种方式)
✅ 方案一:禁用用户站点目录(推荐,安全且可逆)
在激活环境后,临时禁用用户站点包加载:
# Bash/Zsh export PYTHONNOUSERSITE=1 python -c "import scipy; print(scipy.__version__)" # 应输出 1.12.0
为永久生效,可将其加入环境激活脚本(如 conda activate 后自动执行):
# 编辑 ~/.bashrc 或 conda 环境的 activate.d/env_vars.sh echo 'export PYTHONNOUSERSITE=1' >> ~/.bashrc source ~/.bashrc
✅ 方案二:彻底清理本地 SciPy(治本,适用于多用户/CI 环境)
手动删除用户站点中的 SciPy 相关文件(pip uninstall scipy 可能因权限或路径残留失败):
# 查找并移除用户安装的 SciPy ls -la ~/.local/lib/python3.9/site-packages/ | grep -i scipy rm -rf ~/.local/lib/python3.9/site-packages/scipy* rm -rf ~/.local/lib/python3.9/site-packages/scipy-*.dist-info
? 提示:执行前建议备份(
cp -r ~/.local/lib/python3.9/site-packages/scipy* /tmp/scipy-backup/),并确认无其他项目强依赖该本地 SciPy。
验证与预防
-
验证修复效果:
import sys print([p for p in sys.path if 'site-packages' in p]) # 确保 ~/.local/... 不在列表前列,且 conda 环境路径优先 import scipy print(scipy.__version__, scipy.__file__) # __file__ 应指向 conda env 路径
-
预防措施:
- 避免在共享环境中使用
pip install --user; - 创建新环境时添加
--no-user参数(如pip install --no-user scipy==1.12.0); - 在 CI/CD 或部署脚本中显式设置
PYTHONNOUSERSITE=1。
- 避免在共享环境中使用
通过以上任一方法,即可确保跨机器环境的一致性,让 SciPy 版本严格遵循 Conda 环境定义,从根本上规避因路径优先级引发的依赖冲突。


















