conda 环境里原本是 numpy 1.26,pip 装一个包之后 numpy 变成 2.0.1。import scipy 直接报 A numpy version has been detected 和 _ARRAY_API not found。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
conda list numpy pip uninstall -y numpy conda install -y --force-reinstall 'numpy=1.26' python -c "import scipy; print(scipy.__version__)"
conda 装的 numpy 是按它自己的构建链编的,pip 装的新 numpy 是另一个 wheel,ABI 和已编译的 scipy 扩展对不上。两个安装器各自维护一套记录,谁也不知道对方动过什么。这一点先确认清楚,后面就不用反复试。
「numpy 2 ABI 不兼容」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,先用 conda list 和 pip list 对照 numpy 是谁装的 版本从哪来;把 pip 装进来的 numpy 卸掉 再用 conda install --force-reinstall 恢复;在 conda 环境里优先 conda install 用 pip 时加 --no-deps 避免它顺手改 numpy;锁一份 environment.yml 把 conda 和 pip 两段依赖都写进去。
改完照着核一遍,scipy 能正常 import 且 numpy.__version__ 回到 1.26 系列 ABI 报错消失。
