创建干净的conda虚拟环境

可直接落地使用的「干净 ML conda 环境模板」,目标是:

  • 完全隔离:ROS / system / ~/.local
  • 可复现:每次激活环境行为一致
  • 可校验:一条命令确认环境是否“干净”
  • 适用于 torch / vllm / trl / transformers

一、环境目录结构(最终效果)

$CONDA_PREFIX/
└── etc/
    └── conda/
        ├── activate.d/
        │   ├── 00_clean_pythonpath.sh
        │   ├── 01_disable_user_site.sh
        │   └── 02_sanity_print.sh        # 可选
        └── deactivate.d/
            └── 00_restore_pythonpath.sh  # 可选

二、activate.d 脚本(核心)

所有脚本 只作用于当前 conda 环境


1️⃣ 清理 ROS / system 注入的 PYTHONPATH

00_clean_pythonpath.sh

#!/usr/bin/env bash

# 备份原始 PYTHONPATH(仅第一次)
if [[ -z "${_ORIG_PYTHONPATH+x}" ]]; then
    export _ORIG_PYTHONPATH="$PYTHONPATH"
fi

if [[ -n "$PYTHONPATH" ]]; then
    export PYTHONPATH=$(echo "$PYTHONPATH" \
        | tr ':' '\n' \
        | grep -v -E "/opt/ros|/usr/lib|/usr/local/lib" \
        | paste -sd:)
fi

作用:

  • 移除 ROS / system Python 路径
  • 保留你自己手动设置的路径(若有)

2️⃣ 禁用 user site(~/.local)

01_disable_user_site.sh

#!/usr/bin/env bash

export PYTHONNOUSERSITE=1

这是最关键的一步


3️⃣(可选)激活时打印校验提示

02_sanity_print.sh(可选)

#!/usr/bin/env bash

echo "[ML-ENV] Activated clean Python environment:"
echo "  CONDA_PREFIX = $CONDA_PREFIX"
echo "  PYTHONNOUSERSITE = $PYTHONNOUSERSITE"

4️⃣(可选)退出环境时恢复 PYTHONPATH

deactivate.d/00_restore_pythonpath.sh

#!/usr/bin/env bash

if [[ -n "${_ORIG_PYTHONPATH+x}" ]]; then
    export PYTHONPATH="$_ORIG_PYTHONPATH"
    unset _ORIG_PYTHONPATH
else
    unset PYTHONPATH
fi

unset PYTHONNOUSERSITE

三、一键安装模板到指定 conda 环境

假设环境名是 torch2

conda activate torch2

mkdir -p $CONDA_PREFIX/etc/conda/{activate.d,deactivate.d}

# 写入脚本(示例用 cat,可自行用 vim)
cat > $CONDA_PREFIX/etc/conda/activate.d/00_clean_pythonpath.sh <<'EOF'
#!/usr/bin/env bash
if [[ -z "${_ORIG_PYTHONPATH+x}" ]]; then
    export _ORIG_PYTHONPATH="$PYTHONPATH"
fi
if [[ -n "$PYTHONPATH" ]]; then
    export PYTHONPATH=$(echo "$PYTHONPATH" | tr ':' '\n' | grep -v -E "/opt/ros|/usr/lib|/usr/local/lib" | paste -sd:)
fi
EOF

cat > $CONDA_PREFIX/etc/conda/activate.d/01_disable_user_site.sh <<'EOF'
#!/usr/bin/env bash
export PYTHONNOUSERSITE=1
EOF

chmod +x $CONDA_PREFIX/etc/conda/activate.d/*.sh

四、校验脚本(强烈推荐保留)

保存为 check_ml_env.py

import sys
import site
from pathlib import Path

bad_keywords = [
    "/opt/ros",
    "/usr/lib/python",
    "/usr/local/lib/python",
    str(Path.home() / ".local"),
]

print("=== Python Environment Sanity Check ===")
print("Python:", sys.executable)
print("ENABLE_USER_SITE:", site.ENABLE_USER_SITE)
print()

bad = False
for p in sys.path:
    for k in bad_keywords:
        if k in p:
            print("❌ BAD PATH:", p)
            bad = True

if not bad:
    print("✅ sys.path is clean")

print("\nTop of sys.path:")
for p in sys.path[:5]:
    print(" ", p)

运行:

conda activate torch2
python check_ml_env.py

期望结果:

ENABLE_USER_SITE: False
✅ sys.path is clean

五、推荐使用规范(非常重要)

✅ 正确

conda activate torch2
pip install torch vllm trl

❌ 错误

pip install --user xxx
sudo pip install xxx

六、这套模板解决了什么问题?

问题 解决
ROS 污染
~/.local 干扰
pip 装错地方
vllm / torch ABI 冲突
环境不可复现

七、一句话总结

这是一套“生产级”的 ML conda 环境隔离模板,可直接用于 torch / vllm / trl。
它避免了 90% 的 Python 环境诡异问题。

posted @ 2026-01-05 11:44  唐康  阅读(93)  评论(0)    收藏  举报