Python 开发者的经典噩梦:
展开代码# 场景 1:系统 Python 被污染 sudo pip install tensorflow # 破坏系统包,yum/apt 报错 pip install numpy==1.19 # 项目 A 需要 1.19 pip install numpy==1.24 # 项目 B 需要 1.24,A 崩溃 # 场景 2:虚拟环境工具混乱 python -m venv myenv # venv,标准库自带,功能简陋 virtualenv myenv # virtualenv,第三方,历史包袱 pipenv install # Pipenv,Lock 文件慢,争议大 poetry install # Poetry,新兴,生态不成熟
| 特性 | pip + venv | Conda | 说明 |
|---|---|---|---|
| 包管理 | 仅 Python 包 | Python + C/C++/R/Node | 解决 NumPy/Pandas 等科学计算的复杂依赖 |
| 环境隔离 | 是 | 是 | 独立 Python 解释器和库 |
| 二进制分发 | 编译安装慢 | 预编译包(.tar.bz2) | 安装 PyTorch/TensorFlow 从小时降到分钟 |
| 多版本 Python | 需手动编译 | conda install python=3.9 | 一键切换 |
| 跨平台 | 有限 | Windows/macOS/Linux 统一 | 环境导出文件跨平台可用 |
| 环境导出 | requirements.txt | environment.yml | YAML 包含通道、pip 依赖,更完整 |
关键认知:Conda 不仅是 Python 包管理器,更是跨语言、跨平台的通用包管理器和环境管理器。
| 对比项 | Miniconda | Anaconda |
|---|---|---|
| 体积 | ~400 MB | ~3 GB |
| 预装包 | 仅 Conda + Python | 2500+ 科学计算包 |
| 适用场景 | 生产环境、CI/CD、服务器 | 初学者、数据科学入门 |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
结论:生产环境、服务器部署、Docker 镜像必选 Miniconda,避免 Anaconda 的臃肿和许可风险。
展开代码# 1. 下载最新版(国内镜像加速) wget https://mirrors.cernet.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh # 或清华镜像 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh # 2. 校验完整性(可选但推荐) sha256sum Miniconda3-latest-Linux-x86_64.sh # 对比官网公布的哈希值 # 3. 静默安装(-b = batch,-p = prefix) sudo bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 # 4. 全局配置(所有用户可用) echo 'export PATH=/opt/miniconda3/bin:$PATH' | sudo tee /etc/profile.d/miniconda.sh source /etc/profile.d/miniconda.sh # 5. 初始化 Shell(生成 conda 函数) sudo /opt/miniconda3/bin/conda init --all # bash, zsh, fish 全部初始化 # 6. 验证 conda --version conda info
展开代码# 创建 conda 用户组 sudo groupadd conda sudo chgrp -R conda /opt/miniconda3 sudo chmod 775 /opt/miniconda3 sudo chmod g+s /opt/miniconda3 # 新建文件继承组 # 用户加入组 sudo usermod -aG conda $USER # 重新登录生效 # 共享包缓存(节省磁盘) sudo mkdir -p /opt/conda-pkgs sudo /opt/miniconda3/bin/conda config --system --add pkgs_dirs /opt/conda-pkgs
展开代码# 生成或编辑配置文件 cat > ~/.condarc <<'EOF' channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud nvidia: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud EOF # 清除索引缓存 conda clean -i # 验证 conda config --show channels
展开代码# 步骤 1:反向初始化(移除 shell 配置) conda activate base conda init --reverse --all # 步骤 2:删除安装目录 sudo rm -rf /opt/miniconda3 # 系统级安装 rm -rf ~/miniconda3 # 用户级安装 # 步骤 3:删除用户配置 rm -rf ~/.condarc ~/.conda ~/.continuum ~/.anaconda rm -rf ~/.miniconda3 # 可能存在的残留 # 步骤 4:清理 shell 配置(如果 init --reverse 未完全清除) sed -i '/conda initialize/d' ~/.bashrc ~/.zshrc
展开代码# ========== 创建环境 ========== # 基础环境(指定 Python 版本) conda create -n myproject python=3.10 # 指定多个包(版本约束) conda create -n datasci python=3.9 numpy=1.24 pandas=1.5 scikit-learn=1.3 # 从 requirements.txt 迁移(混合使用) conda create -n mixed python=3.10 conda activate mixed pip install -r requirements.txt # 纯 pip 包继续用 pip # 禁用默认包(.condarc 中配置了默认安装包时) conda create -n minimal python=3.11 --no-default-packages # ========== 查看环境 ========== conda env list # 或 conda info --envs # 输出: # base * /opt/miniconda3 # * 表示当前激活 # myproject /opt/miniconda3/envs/myproject # datasci /home/user/.conda/envs/datasci # 查看环境详情 conda info -n myproject # ========== 激活/停用 ========== conda activate myproject # 激活 conda deactivate # 停用(回到 base 或系统) # ========== 删除环境 ========== conda remove -n myproject --all # 彻底删除 # 或 conda env remove -n myproject
展开代码# 克隆环境(同机器备份) conda create --name myproject-backup --clone myproject # 导出环境文件(跨机器迁移) conda activate myproject conda env export > environment.yml # 查看 environment.yml 内容 cat environment.yml # name: myproject # channels: # - conda-forge # - defaults # dependencies: # - python=3.10.12 # - numpy=1.24.3 # - pip: # - some-pip-only-package==1.0.0 # 从文件创建环境(另一台机器) conda env create -f environment.yml # 指定新名字创建 conda env create -f environment.yml -n myproject-new
展开代码# 查看环境变更历史 conda list --revisions # 输出: # 2023-10-15 09:23:23 (rev 0) # +numpy-1.24.3 # +python-3.10.12 # # 2023-10-20 14:15:08 (rev 1) # +pandas-2.0.3 # -numpy-1.24.3 # +numpy-1.25.0 # 回滚到指定版本 conda install --revision=0 # 回到最初状态 # 撤销最后一次操作 conda install --revision=-2 # 倒数第二个版本
展开代码# 创建到指定路径(非标准 envs 目录) conda create --prefix /data/conda-envs/bigdata python=3.10 # 激活(必须全路径) conda activate /data/conda-envs/bigdata # 查看 conda env list # /data/conda-envs/bigdata * /data/conda-envs/bigdata # 重命名(实际是克隆+删除) conda create --name bigdata-renamed --clone /data/conda-envs/bigdata conda remove --prefix /data/conda-envs/bigdata --all
展开代码# 搜索包 conda search numpy conda search numpy=1.24 # 指定版本 # 安装包 conda install numpy conda install numpy=1.24.3 # 精确版本 conda install "numpy>=1.24,<1.25" # 范围 # 指定通道(channel) conda install pytorch torchvision torchaudio -c pytorch -c nvidia # 更新包 conda update numpy conda update --all # 更新所有 # 删除包 conda remove numpy
展开代码# 步骤 1:优先用 Conda 安装底层依赖 conda create -n ml python=3.10 conda activate ml conda install numpy scipy pandas scikit-learn # 步骤 2:Conda 没有的包,再用 pip pip install transformers datasets accelerate # 步骤 3:锁定完整环境(生产必备) conda env export --from-history > environment.yml # 仅手动安装的包 pip list --format=freeze > requirements.txt # pip 包清单 # 或使用 conda-lock(更严谨) conda install conda-lock conda-lock -f environment.yml -p linux-64
关键原则:
| 场景 | 工具 | 原因 |
|---|---|---|
| NumPy/SciPy/Pandas/Matplotlib | Conda | MKL 优化,预编译二进制 |
| PyTorch/TensorFlow/JAX | Conda | CUDA 版本自动匹配 |
| 纯 Python 包(Django/Flask/FastAPI) | pip | Conda 通道可能滞后 |
| 最新开发版 | pip | pip install git+https://... |
展开代码# 诊断环境完整性 conda doctor # 输出示例: # ✔ Environment is listed in environments.txt # ✔ Environment has a valid prefix # ✔ No broken packages found # ✖ Missing files: 2 packages have missing files # - numpy: 1 file missing (lib/libmkl_rt.so) # - pytorch: 3 files missing # 修复:重新安装问题包 conda install --force-reinstall numpy pytorch
展开代码# Dockerfile FROM continuumio/miniconda3:latest # 复制环境文件 COPY environment.yml /tmp/ # 创建环境(使用 conda-pack 或直接从文件) RUN conda env create -f /tmp/environment.yml && \ conda clean -afy # 激活环境(Docker 中需用 shell 包装) SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"] # 或 ENTRYPOINT 激活 ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "myenv", "python"] CMD ["app.py"]
更优方案:使用 conda-pack(预打包环境)
展开代码# 在开发机打包 conda install conda-pack conda pack -n myenv -o myenv.tar.gz # Dockerfile 中解压即用 FROM debian:bullseye-slim COPY myenv.tar.gz /tmp/ RUN mkdir -p /opt/myenv && tar -xzf /tmp/myenv.tar.gz -C /opt/myenv ENV PATH=/opt/myenv/bin:$PATH
展开代码# .github/workflows/python-app.yml name: Python CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v3 - name: Setup Miniconda uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true python-version: ${{ matrix.python-version }} environment-file: environment.yml activate-environment: test-env - name: Run tests shell: bash -l {0} run: | conda activate test-env pytest tests/
展开代码# 禁用 conda 更新提示(每次激活都提示很烦) conda config --set notify_outdated_conda false # 禁用默认激活 base 环境 conda config --set auto_activate_base false # 在 .condarc 中完整配置 cat > ~/.condarc <<'EOF' channels: - defaults show_channel_urls: true notify_outdated_conda: false auto_activate_base: false create_default_packages: [] EOF
| 现象 | 诊断 | 解决 |
|---|---|---|
conda: command not found | echo $PATH | 添加 /opt/miniconda3/bin 到 PATH |
Solving environment: failed | conda clean --all | 清除缓存,或换国内镜像 |
PackagesNotFoundError | conda search pkg | 换 channel 或改用 pip |
Permission denied | ls -la /opt/miniconda3 | sudo chown -R $USER:$USER 或加用户到 conda 组 |
| 环境激活后 pip 指向系统 | which pip | 用 python -m pip 或重装 pip |
| 包冲突无法解决 | conda list --revisions | 回滚或创建干净环境 |
| 环境损坏 | conda doctor | conda install --force-reinstall 或重建 |
展开代码# ========== 安装与配置 ========== wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 conda init --all conda config --set auto_activate_base false # ========== 环境管理 ========== conda create -n myenv python=3.10 conda activate myenv conda deactivate conda env list conda remove -n myenv --all conda create --name clone --clone myenv # ========== 包管理 ========== conda install numpy=1.24 conda update --all conda remove numpy conda list conda search pkg # ========== 导入导出 ========== conda env export > environment.yml conda env create -f environment.yml conda list --revisions conda install --revision=0 # ========== 维护 ========== conda clean -i # 清除索引缓存 conda clean -p # 清除未使用包 conda clean -a # 清除所有 conda doctor # 健康检查
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!