
同一 Conda 环境在多台机器上运行时,scipy.__version__ 返回不一致(如环境声明为 1.12.0 却实际加载 1.13.1),根本原因在于 Python 优先加载了用户本地站点包(~/.local/lib/python3.9/site-packages/)中的 SciPy,而非 Conda 环境内的版本。
同一 conda 环境在多台机器上运行时,`scipy.__version__` 返回不一致(如环境声明为 1.12.0 却实际加载 1.13.1),根本原因在于 python 优先加载了用户本地站点包(`~/.local/lib/python3.9/site-packages/`)中的 scipy,而非 conda 环境内的版本。
这种行为通常由 Python 的模块搜索路径(sys.path)顺序导致:默认情况下,site-packages 中的用户本地目录(~/.local/lib/pythonX.Y/site-packages/)会被插入到 sys.path 前部,早于 Conda 环境的 site-packages。当该目录下存在同名包(如 scipy)时,Python 会优先导入它——即使 Conda 环境已明确安装指定版本(如 scipy==1.12.0),也会被本地残留的 1.13.1 覆盖。
这在依赖 SciPy 的库(如 jax)中尤为敏感。例如,您使用的 jax==0.2.19 对 SciPy 版本有隐式兼容要求,若实际加载了不匹配的 1.13.1,可能引发运行时错误或数值行为差异。
✅ 推荐解决方案(二选一)
方案一:禁用用户站点包(推荐,安全且可复现)
在激活 Conda 环境后,执行:
export PYTHONNOUSERSITE=1
为确保每次激活环境时自动生效,可将其添加到环境的 activation hook 中:
# 创建 activation 脚本(Linux/macOS) echo 'export PYTHONNOUSERSITE=1' >> $CONDA_PREFIX/etc/conda/activate.d/env_vars.sh echo 'unset PYTHONNOUSERSITE' >> $CONDA_PREFIX/etc/conda/deactivate.d/env_vars.sh
✅ 优点:无需修改文件系统;不影响其他环境;与 CI/CD 兼容性好。
⚠️ 注意:该变量仅对当前 shell 及其子进程生效,需在运行 Python 前设置。
方案二:彻底清理本地 SciPy 安装
若确认不需要全局 SciPy,手动删除用户站点中的残留包:
rm -rf ~/.local/lib/python3.9/site-packages/scipy* rm -rf ~/.local/lib/python3.9/site-packages/scipy-*.dist-info
✅ 优点:根治问题,避免未来干扰。
⚠️ 注意:pip uninstall scipy可能因权限或路径问题失败(尤其当包由--user安装但未被 pip 正确追踪时),手动清理更可靠;操作前建议备份或确认该目录无其他关键包。
? 验证修复效果
执行以下命令确认加载路径与版本一致性:
import scipy
print("Version:", scipy.__version__)
print("Location:", scipy.__file__)
import sys
print("First 3 paths in sys.path:")
for p in sys.path[:3]:
print(f" → {p}")✅ 正确输出应显示 scipy.__file__ 指向 $CONDA_PREFIX/lib/python3.9/site-packages/scipy/,且 sys.path[0] 不包含 ~/.local/。
? 总结
跨机器部署 Conda 环境时,用户本地站点包(--user 安装)是常见的“隐形污染源”。PYTHONNOUSERSITE=1 是最轻量、可审计、符合环境隔离原则的解决方案;而手动清理适用于已知污染且需长期稳定的场景。无论选择哪种方式,都建议在团队协作中将 PYTHONNOUSERSITE=1 写入环境配置或部署脚本,确保环境行为完全可复现。

















