应优先用conda install安装包,尤其含C扩展的库;若必须用pip,需在激活conda环境后仅用pip install --no-deps装纯Python包,并立即用conda list核对版本冲突。

Conda安装的包被pip覆盖后报ModuleNotFoundError
这是最常见也最隐蔽的问题:你用conda install numpy装了NumPy,之后又用pip install --upgrade numpy,结果下次运行时突然报ModuleNotFoundError: No module named 'numpy'。根本原因不是没装,而是pip把包装到了site-packages里一个conda环境没加载的路径下,或者覆盖了conda管理的元数据。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 永远优先用
conda install安装包,尤其对numpy、scipy、pytorch这类含C扩展的包 - 如果必须用
pip(比如装conda仓库没有的包),请在conda环境激活后,**只用pip install --no-deps装纯Python包**,避免它顺手升级依赖而破坏conda的依赖图 - 装完pip包后,立刻运行
conda list核对版本是否冲突;若发现同一包同时出现在conda list和pip list中且版本不一致,说明已出问题
如何安全地混用conda和pip
官方文档其实明确说过:conda和pip可以共存,但顺序不能错——先conda,后pip,且中间不执行conda update --all。一旦你用conda update --all,它可能把pip装的包“回滚”掉,因为conda不知道那些包是pip装的。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 创建新环境时,先用
conda create -n myenv python=3.9,再conda activate myenv - 接着用
conda install装所有能装的核心依赖(numpy、pandas、matplotlib等) - 最后才用
pip install装conda没有的包,例如pip install git+https://github.com/xxx/yyy.git - 装完后运行
pip check确认无依赖冲突;若报错,别急着pip install --force-reinstall,先查这个包是否本就有conda版(用anaconda search -t conda xxx)
conda list和pip list显示不同版本怎么办
这不是bug,是事实:conda和pip维护各自的包记录。当你看到conda list torch显示1.12.1,而pip list | grep torch显示2.0.1,说明pip偷偷装了一个新版,但conda仍认为旧版是“权威”。此时Python导入的其实是pip装的那个,但conda后续操作(如conda env export)会导出旧版,导致环境不可复现。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
python -c "import torch; print(torch.__file__)"确认实际加载的是哪个路径下的包 - 若路径在
.../site-packages/且不在conda的pkgs/目录下,基本就是pip装的 - 修复方法不是卸载重装,而是:先
pip uninstall torch,再conda install pytorch::pytorch(指定channel)或conda install -c pytorch pytorch - 切忌用
pip install torch——它默认从PyPI装CPU版,而conda通常装的是带CUDA支持的版本,功能直接降级
导出环境时environment.yml漏掉pip包
conda env export > environment.yml默认只导出conda管理的包,pip装的包不会自动写进去。下次用conda env create -f environment.yml重建环境时,那些pip包就没了,代码直接报错。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 导出前手动补全:
conda env export --from-history > environment.yml(仅对用conda install装的包有效) - 更可靠的做法是:导出后,用
pip freeze > requirements.txt单独保存pip包列表,然后在environment.yml末尾加上pip:段:
dependencies:
- python=3.9
- numpy
- pip
- pip:
- some-pip-only-package==1.2.3
- git+https://github.com/xxx/yyy.git@main注意:pip必须作为conda依赖显式列出,否则conda env create不会安装pip,后续pip部分直接跳过。
真正麻烦的从来不是“能不能混用”,而是“混用之后谁负责清理、谁负责锁定、谁负责告诉CI系统该装什么”。只要pip包一多,environment.yml就容易漏、pip list就容易脏、CI里pip install -r requirements.txt还可能跟conda装的包打架。所以,能用conda装的,别让pip碰。


















