关键词:conda、pip、冲突包、卸载、CondaPackError、环境修复
1. 事故背景
今天准备把训练好的 Faster-Whisper 环境打包迁移,结果 conda pack
直接拒绝:
CondaPackError: Files managed by conda were found to have been deleted/overwritten...
- pip 25.1: +440 files
用 conda list | grep pip
一看,果然出现了 两条记录:
pip 25.1 pypi_0 pypi
pip 24.0 py310h06a4308_0 conda-forge
同一环境同时存在 pypi 版 和 conda 版,文件互相覆盖,conda pack
罢工。
2. 为什么会冲突?
安装方式 | 写入路径 | 元数据 | 典型后果 |
---|---|---|---|
conda install pip |
$CONDA_PREFIX/lib/python3.x/site-packages |
$CONDA_PREFIX/conda-meta/pip-*.json |
受 conda 保护 |
pip install --upgrade pip |
同上 | 无 conda 元数据 | 覆盖文件 → 元数据与实际不符 |
一旦 pip 升级了 conda 管理的包,conda 认为文件“失踪”或“被篡改”,打包/更新都会失败。
3. 排查冲突包(通用脚本)
# 1. 列出所有重复包
comm -12 \
<(conda list | awk '{print $1}' | sort) \
<(pip list | awk '{print $1}' | sort)
# 2. 查看具体版本
conda list | grep <包名>
pip show <包名>
4. 卸载冲突包的三种姿势
✅ 姿势 1:温和卸载(推荐)
先卸 pip 安装的版本,再让 conda 接管:
# 以 pip 为例
pip uninstall pip -y # 移除 pypi 版 25.1
conda install pip=24.0 # 重新安装 conda 版
对其他包同理,如
setuptools
、wheel
、numpy
…
✅ 姿势 2:强制覆盖(不想卸载)
conda install --force-reinstall <包名>=<版本>
✅ 姿势 3:一键“清 pip”后重装(极端情况)
# 1. 备份当前 pip 列表
pip freeze > pip_pkgs.txt
# 2. 全部卸掉
pip uninstall -r pip_pkgs.txt -y
# 3. 用 conda 重装
xargs -a pip_pkgs.txt conda install -y
5. 一键脚本:自动检测并修复冲突
保存为 fix_conda_pip_clash.sh
:
#!/usr/bin/env bash
env=$1
[[ -z "$env" ]] && { echo "Usage: $0 <env_name>"; exit 1; }
source "$(conda info --base)/etc/profile.d/conda.sh"
conda activate "$env"
# 找出 conda & pip 同时存在的包
conflicts=$(comm -12 \
<(conda list | awk 'NF>1{print $1}' | sort) \
<(pip list | awk 'NF>1{print $1}' | sort))
for pkg in $conflicts; do
echo "🔧 Fixing $pkg ..."
pip uninstall "$pkg" -y 2>/dev/null || true
conda install "$pkg" -y
done
echo "✅ Done. Try \`conda pack\` again."
执行:
chmod +x fix_conda_pip_clash.sh
./fix_conda_pip_clash.sh sw_test_env
6. 验证:环境已干净
conda list | grep pip
# 期望输出只有一行 conda 版
再次打包:
conda pack -n sw_test_env -o sw_test_env.tar.gz
# ✅ 成功
7. 预防锦囊
场景 | 建议 |
---|---|
日常升级 | conda update <包> 优先;万不得已再用 pip |
必须用 pip | 加 --no-deps 防止拉低 conda 依赖 |
CI/镜像 | 在 Dockerfile 里统一用 conda install |
环境迁移 | 先用 conda env export --from-history 导出,再重建 |
8. 一句话总结
出现冲突包时,先
pip uninstall
,再conda install
,让 conda 重新掌权,打包即可恢复。