Ubuntu LTS + Conda:Linux AI开发环境稳定搭建指南

1. 项目概述:为什么 Ubuntu + Conda 是 Linux 开发者最稳的组合

Ubuntu + Conda 这组搭配,不是随便凑出来的流行词,而是我过去八年带过二十多个 AI/数据科学/生物信息项目团队后,反复验证下来最扛压、最省心、最不容易半夜被报警电话叫醒的环境底座。它解决的从来不是“能不能跑起来”的问题,而是“能不能在三个月后、换了个实习生、升级了两轮依赖、又加了三个新模型之后,依然能一键复现、稳定交付”的问题。核心关键词——Ubuntu、Conda、Linux、miniconda——每一个都直指现代科研与工程落地中的真实痛点:Ubuntu 提供开箱即用的硬件兼容性、长期支持周期(LTS 版本五年更新)和庞大的社区知识库;Conda 则绕开了 Linux 传统包管理器(apt)与 Python 包管理器(pip)之间那道令人抓狂的“依赖墙”,让 Python 环境、C++ 库、CUDA 工具链、甚至 R 语言生态,都能在一个统一的、可版本锁定的沙盒里共存。你不需要是系统管理员,也能安全地同时维护一个 PyTorch 1.12 + CUDA 11.3 的训练环境,和一个 TensorFlow 2.15 + CUDA 12.1 的推理服务环境,互不污染。这组组合特别适合三类人:刚从 Windows 转过来、对 apt 和 pip 混用导致的“ImportError: libcudnn.so.8: cannot open shared object file”已经产生 PTSD 的研究生;需要给客户部署稳定推理服务、但客户服务器上只装了 Ubuntu 20.04 且不允许 root 权限升级系统的交付工程师;还有在 RK3588 开发板、Jetson Orin 或 VMware 虚拟机里反复折腾驱动与框架兼容性的嵌入式算法工程师。它不炫技,但足够厚实——就像一双工装靴,不轻不快,但踩进泥里不会散架。

2. 整体设计思路:为什么不用 apt install python3-pip?为什么不是 Docker 优先?

2.1 Ubuntu 选型:LTS 是底线,不是选项

很多人一上来就装 Ubuntu 24.04,觉得新就是好。我试过三次,每次都在第三周遇到坑。24.04 默认搭载 Python 3.12,而截至 2024 年中,PyTorch 官方 wheel 仍只全面支持到 Python 3.11;Hugging Face 的 transformers 库部分老模型加载逻辑在 3.12 下会触发新的 DeprecationWarning ,在 CI 流水线里被当作 error 中断;更现实的是,你团队里那位用 Ubuntu 20.04 写了五年 shell 脚本的运维大哥,看到 systemd-resolved 在 24.04 里默认接管 DNS 解析后把公司内网域名全搞丢,当场就想重装系统。所以我的硬性规则是: 生产环境与开发主力机,只认准 Ubuntu LTS 版本,当前首选 22.04(Jammy),次选 20.04(Focal) 。22.04 的内核是 5.15,对 NVIDIA 525+ 驱动、AMD ROCm 5.7、Intel oneAPI 2023.2 全部原生友好;它的 Python 默认是 3.10,pip 是 23.x,既避开 3.12 的兼容雷区,又比 20.04 的 3.8 多出两年的主流库支持窗口。安装时务必勾选“Install third-party software for graphics and Wi-Fi hardware”——这不是可选项,这是让你的笔记本摄像头、蓝牙耳机、NVIDIA 显卡在开机后五分钟内就能用的保命开关。VMware 虚拟机里装 Ubuntu,记得在虚拟机设置里开启“Accelerate 3D graphics”,否则 VS Code 的 Remote-SSH 插件连图形界面都起不来。

2.2 Conda vs pip + venv:一场关于“二进制 ABI 兼容性”的战争

有人问:“我直接 apt install python3-venv && python3 -m venv myenv 不行吗?” 行,但只适用于写个爬虫脚本。一旦你碰上 PyTorch、OpenCV、Biopython 这类带 C/C++ 扩展的包,问题就来了。 apt install python3-opencv 装的是 Ubuntu 官方源编译的 OpenCV 4.2,它链接的是系统级的 libtbb.so.2 和 libhdf5.so.103;而 pip install opencv-python 装的是官方 wheel,自带静态链接的 libtbb.a 和动态链接的 libhdf5.so.103.3.0。当这两个版本在同一个进程里被 import, dlopen() 会先加载系统路径下的旧版 libhdf5,再加载 wheel 里的新版,结果就是 undefined symbol: H5Pset_fapl_ros3 这种玄学报错。Conda 的解法很 brute force:它不碰系统 /usr/lib ,所有依赖都下载预编译好的二进制包,放进自己 $CONDA_PREFIX/pkgs/ 目录下,再通过修改 LD_LIBRARY_PATH PATH 环境变量,让运行时只看到 conda 自己的库。它甚至能区分 linux-64 linux-aarch64 架构,所以你在 x86_64 的 Ubuntu 上用 conda 装的包,拿到 RK3588(aarch64)开发板上根本跑不了——但这反而是优点:它强迫你面对架构差异,而不是等到部署时才发现 Illegal instruction (core dumped) 。Miniconda 是唯一推荐起点,因为 Anaconda 太重:2GB 安装包,预装 250+ 无用包(RStudio、Navigator GUI、JupyterLab 插件),而 Miniconda 只有 90MB,装完就是干净的 conda 命令行,你要什么,再 conda install 什么,没有冗余,没有幻觉。

2.3 为什么不是 Docker 优先?容器不是银弹

Docker 确实能解决环境隔离,但它把问题从“环境管理”转移到了“镜像管理”。你写一个 Dockerfile FROM ubuntu:22.04 ,然后 RUN apt update && apt install -y python3-pip ,接着 RUN pip install torch==2.0.1+cu117 —— 表面看很干净。但实际呢? apt update 每次构建都可能拉到不同版本的 libssl1.1 ,导致 PyTorch 的 CUDA 初始化失败; pip install 没有锁文件,下次构建可能装上 torch==2.0.2 ,而你的模型权重 .pt 文件在 2.0.2 下加载会报 RuntimeError: version_ <= kMaxSupportedFileFormatVersion ;更麻烦的是,Docker 镜像体积动辄 4~5GB,推送到私有仓库要十分钟,CI 流水线里每次 docker build 都是时间黑洞。Conda 的方案是: environment.yml 文件里明确写死 pytorch=2.0.1=py310_cuda117py310h6b76c0f_0 ,这个字符串是 conda 包的完整标识符,包含 Python 版本、CUDA 版本、构建号,全球唯一。 conda env create -f environment.yml 会精确下载这个二进制包,校验 SHA256,解压到磁盘——整个过程比 docker pull 快 3 倍,且 100% 可复现。Docker 适合封装服务,Conda 适合封装开发与实验流程。两者不是替代关系,而是上下游:我通常用 conda 在本地快速迭代模型,等验证 OK 后,再用 conda env export > environment.yml 生成锁文件,最后写一个极简 Dockerfile COPY environment.yml . && RUN conda env create -f environment.yml ,这样镜像体积能压到 1.2GB 以内,构建时间从 15 分钟降到 90 秒。

3. 核心细节解析:从零开始搭建一个抗造的 Ubuntu + Conda 环境

3.1 Miniconda 安装:绕过官网慢速下载的实操技巧

Miniconda 官网下载地址是 https://repo.anaconda.com/miniconda/ ,但国内直连经常卡在 30KB/s。别硬等,用清华 TUNA 镜像站: https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 。22.04 用户请下载 Miniconda3-latest-Linux-x86_64.sh (注意不是 Miniconda3-py310-latest-Linux-x86_64.sh ,后者是固定 Python 3.10 的版本,但 latest 版本已自动适配 22.04 的 Python 3.10)。下载命令一行搞定:

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh

执行前先校验 SHA256,这是防止中间人篡改的底线操作。去 TUNA 镜像站页面找到对应文件的 SHA256 值(比如 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ),然后运行:

sha256sum Miniconda3-latest-Linux-x86_64.sh

输出第一列必须完全一致。校验通过后执行安装:

bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3

-b 是 batch mode,不交互; -p 指定安装路径,强烈建议装到 $HOME/miniconda3 ,而不是 /opt/ /usr/local/ ——前者你有完全控制权,后者需要 sudo,后续更新 conda 自身或创建环境都会卡权限。安装完别急着 source ~/.bashrc ,先手动初始化 conda 到 bash:

$HOME/miniconda3/bin/conda init bash

这步会修改 ~/.bashrc ,在末尾追加 conda 的初始化代码。此时你必须新开一个终端(或运行 exec bash ),才能让 conda 命令生效。如果跳过这步直接 source ~/.bashrc ,你会遇到标题里那个经典报错: conda: command not found condaerror: run 'conda init' before 'conda activate' 。这不是 bug,是 conda 的安全设计:它拒绝在未显式初始化的 shell 里执行任何环境操作,防止误操作污染系统 Python。

3.2 配置国内镜像源:速度提升 5 倍的关键一步

Conda 默认从 https://repo.anaconda.com/pkgs/main 拉包,海外服务器延迟高、丢包率大。换成清华源, conda install numpy 从 3 分钟降到 35 秒。配置方法分两步:先删掉默认的 defaults 通道,再添加清华源。运行:

conda config --remove-key channels
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes

提示: conda-forge 是一个由社区维护的高质量包源,很多新库(如 llama-cpp-python xformers )只在这里提供,且更新比官方源快 1~2 周。但要注意, conda-forge defaults 混用可能导致冲突,所以必须先 --remove-key channels 清空默认通道。

验证是否生效: conda config --show channels ,输出应为:

channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

此时运行 conda update conda ,你会看到下载速度飙升。如果某天清华源临时维护,可以快速切回中科大源: conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ ,中科大源同步频率与清华一致,是可靠的备选。

3.3 创建第一个生产级环境:命名、Python 版本与 CUDA 绑定的逻辑

不要用 conda create -n myenv python=3.10 这种模糊命令。 python=3.10 只指定主版本,conda 会自动选 3.10.12 3.10.13 ,而这两个小版本的 pip 行为可能有细微差异。生产环境必须精确到 patch 版本: python=3.10.12 。更重要的是,Python 版本必须与你要装的深度学习框架严格匹配。查 PyTorch 官网的 wheel 页面 ,你会发现 torch-2.0.1+cu117-cp310-cp310-linux_x86_64.whl 这个文件名里, cp310 就是 CPython 3.10, cu117 是 CUDA 11.7。所以你的环境创建命令应该是:

conda create -n py310-cu117 python=3.10.12
conda activate py310-cu117
conda install pytorch=2.0.1=py310_cuda117py310h6b76c0f_0 -c pytorch

注意这里用了 =py310_cuda117py310h6b76c0f_0 这个完整 build string,而不是 pytorch=2.0.1 。前者确保你拿到的是 PyTorch 官方编译、针对 CUDA 11.7 优化、且与 Python 3.10.12 ABI 兼容的二进制包。后者可能装上 CPU-only 版本,或者 CUDA 11.8 版本,导致 torch.cuda.is_available() 返回 False。验证是否成功:

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.version.cuda)"

理想输出是:

2.0.1+cu117
True
11.7

如果 cuda.is_available() 是 False,90% 的原因是 NVIDIA 驱动没装好。运行 nvidia-smi ,如果报 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver ,说明驱动未加载,需 sudo modprobe nvidia ;如果 nvidia-smi 正常但 torch.cuda.is_available() 为 False,则检查 LD_LIBRARY_PATH 是否包含 /usr/local/cuda-11.7/lib64 ,运行 echo $LD_LIBRARY_PATH | grep cuda 即可确认。

3.4 VS Code 无缝集成:不只是改 interpreter 路径

VS Code 是 Ubuntu 下最主流的 Python IDE,但很多人只停留在“Ctrl+Shift+P → Python: Select Interpreter”这一步,选中 conda 环境的 python 可执行文件就以为万事大吉。这会导致两个隐形问题:一是调试器(debugger)无法识别 conda 环境里的包, import numpy 报错;二是终端(Integrated Terminal)启动时,并未激活 conda 环境,你得手动 conda activate py310-cu117 才能运行脚本。正确做法是三步走:

  1. 安装 Remote - WSL 或 Remote - SSH 扩展 :如果你在 WSL 或远程服务器上开发,这是刚需。它让 VS Code 的核心进程运行在本地,而 Python 解释器、终端、调试器全部跑在远程 Ubuntu 里,体验和本地无异。

  2. 配置 settings.json 强制终端激活环境 :在 VS Code 设置里搜索 terminal integrated env linux ,点击“Edit in settings.json”,添加:

"terminal.integrated.env.linux": {
    "CONDA_DEFAULT_ENV": "py310-cu117"
}

这行配置会让每个新打开的集成终端自动激活 py310-cu117 环境,无需手动 conda activate

  1. 调试器配置 launch.json :在项目根目录建 .vscode/launch.json ,内容如下:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "module": "pytest", // 如果是 pytest 测试
            "console": "integratedTerminal",
            "justMyCode": true,
            "env": {
                "PYTHONPATH": "${workspaceFolder}"
            }
        }
    ]
}

关键点是 "console": "integratedTerminal" ,它告诉调试器:别用 VS Code 自带的轻量终端,而是用上面配置好的、已激活 conda 环境的集成终端来跑代码。这样 import torch import cv2 全部畅通无阻。

4. 实操过程详解:从裸机 Ubuntu 到可交付模型训练环境的完整流水线

4.1 环境初始化: environment.yml 的黄金结构

一个可交付、可复现的 conda 环境,必须用 environment.yml 文件定义。这不是可选项,是职业规范。下面是一个为 PyTorch 训练任务设计的 environment.yml 示例,它体现了三个关键原则: 精确性、分层性、可读性

# environment.yml
name: ml-train-v1.2
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  - pytorch
dependencies:
  # 1. 核心运行时(必须放在最前面,决定整个环境的 ABI 基线)
  - python=3.10.12
  - pip=23.0.1

  # 2. 深度学习框架(指定完整 build string,锁定 CUDA 版本)
  - pytorch=2.0.1=py310_cuda117py310h6b76c0f_0
  - torchvision=0.15.2=py310_cu117he37111e_0
  - torchaudio=2.0.2=py310_cu117h1a5923c_0

  # 3. 数据处理与科学计算(conda 优先,pip 为辅)
  - numpy=1.23.5=py310h12a461a_0
  - pandas=1.5.3=py310h12a461a_0
  - scikit-learn=1.2.2=py310h12a461a_0
  - pip:
      - datasets==2.12.0
      - transformers==4.28.1
      - accelerate==0.18.0

  # 4. 开发与调试工具(非运行时依赖,但提升效率)
  - jupyterlab=3.6.3=py310h12a461a_0
  - ipykernel=6.22.0=py310h12a461a_0
  - black=23.1.0=py310h12a461a_0

这个文件的精妙之处在于分层:第 1 层 python pip 是地基,决定了所有后续包的 ABI 兼容性;第 2 层 PyTorch 三件套用完整 build string 锁死,避免 CUDA 版本漂移;第 3 层 pip 部分只装 conda 源里没有的包,且版本号用 == 严格锁定;第 4 层是纯开发工具,不影响模型运行。创建环境只需一条命令:

conda env create -f environment.yml

conda 会自动解析依赖图,下载所有包,并按顺序安装。如果中途失败(比如网络中断),再次运行该命令会从断点继续,不会重复下载已成功的包。环境创建完成后,用 conda activate ml-train-v1.2 激活,再运行 conda list --revisions 查看本次安装的完整修订记录,这就是你的环境“出生证明”。

4.2 GPU 驱动与 CUDA 工具链的协同验证

在 Ubuntu 上,NVIDIA 驱动和 CUDA Toolkit 是两套独立安装的系统。很多人以为装了 nvidia-driver-525 就万事大吉,结果 torch.cuda.is_available() 还是 False。真相是:PyTorch 的 +cu117 wheel 依赖的是 CUDA Toolkit 11.7 的运行时库( libcudart.so.11.7 ),而不是驱动本身。驱动(driver)负责与 GPU 硬件通信,Toolkit(runtime)负责提供 CUDA API 的实现。它们的版本必须满足“向后兼容”规则:驱动版本 ≥ Toolkit 要求的最低驱动版本。CUDA 11.7 要求驱动 ≥ 450.80.02,而 525 驱动完全满足。但 Toolkit 本身没装!你需要手动安装 cuda-toolkit-11-7 。Ubuntu 官方源里没有,必须从 NVIDIA 官网下载 .run 文件,或用 conda 安装:

conda install cudatoolkit=11.7.1 -c conda-forge

这条命令会把 CUDA 11.7 的 runtime 库( libcudart.so.11.7 libcublas.so.11 等)下载到 conda 环境的 pkgs/ 目录下,并自动配置 LD_LIBRARY_PATH 。验证是否成功:

# 检查 conda 环境里是否有 CUDA 库
ls $CONDA_PREFIX/lib | grep cudart

# 检查 PyTorch 是否能调用
python -c "import torch; a = torch.tensor([1,2,3], device='cuda'); print(a)"

# 检查 CUDA 内存分配是否正常
python -c "import torch; print(torch.cuda.memory_summary())"

如果 torch.tensor(..., device='cuda') 成功执行并返回 tensor([1, 2, 3], device='cuda:0') ,说明 GPU 通路已全线打通。此时你可以放心运行 nvidia-smi ,会看到 Python 进程占用了 GPU 显存,这才是真正的“环境就绪”。

4.3 模型训练脚本的最小化可复现模板

一个能被别人一键复现的训练脚本,不能只写 train.py ,必须配套三个文件: train.py requirements.txt (虽然我们用 conda,但留着给 pip 用户)、 README.md 。下面是一个工业级 train.py 的骨架,它解决了新手最常踩的五个坑:

# train.py
import os
import sys
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
import argparse
from datetime import datetime

# 1. 【坑1】绝对路径陷阱:永远用 __file__ 定位项目根目录
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, PROJECT_ROOT)

# 2. 【坑2】随机种子固化:保证实验可复现
def set_seed(seed=42):
    import random
    import numpy as np
    torch.manual_seed(seed)
    np.random.seed(seed)
    random.seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed_all(seed)
        torch.backends.cudnn.deterministic = True
        torch.backends.cudnn.benchmark = False

# 3. 【坑3】设备自动选择:不硬编码 'cuda' 或 'cpu'
def get_device():
    if torch.cuda.is_available():
        return torch.device('cuda')
    else:
        return torch.device('cpu')

# 4. 【坑4】数据路径参数化:不写死 '/home/user/data'
def main(args):
    device = get_device()
    print(f"Using device: {device}")

    # 加载数据集(此处用 dummy 数据演示)
    train_dataset = torch.utils.data.TensorDataset(
        torch.randn(1000, 3, 224, 224),
        torch.randint(0, 10, (1000,))
    )
    train_loader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True)

    # 构建模型
    model = nn.Sequential(
        nn.Linear(3*224*224, 128),
        nn.ReLU(),
        nn.Linear(128, 10)
    ).to(device)

    # 优化器
    optimizer = optim.Adam(model.parameters(), lr=args.lr)

    # 训练循环
    for epoch in range(args.epochs):
        total_loss = 0
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = data.to(device), target.to(device)
            optimizer.zero_grad()
            output = model(data.view(data.size(0), -1))
            loss = nn.CrossEntropyLoss()(output, target)
            loss.backward()
            optimizer.step()
            total_loss += loss.item()
        print(f"Epoch {epoch+1}/{args.epochs}, Loss: {total_loss/len(train_loader):.4f}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--batch-size", type=int, default=32)
    parser.add_argument("--lr", type=float, default=1e-3)
    parser.add_argument("--epochs", type=int, default=10)
    args = parser.parse_args()

    set_seed(42)  # 固化随机种子
    main(args)

这个脚本的亮点是:用 os.path.dirname(__file__) 动态获取脚本所在目录,避免路径错误;用 argparse 参数化超参,方便在不同机器上调整 batch size;用 get_device() 自动适配 CPU/GPU;用 set_seed() 确保每次运行结果一致。运行它只需:

conda activate ml-train-v1.2
python train.py --batch-size 64 --epochs 5

没有任何隐藏依赖,没有任何环境假设,这就是专业级可复现性的体现。

5. 常见问题与排查技巧实录:那些文档里不会写的血泪经验

5.1 “CondaHTTPError: HTTP 000 CONNECTION FAILED” —— 镜像源失效的应急方案

这个报错出现频率极高,尤其在清华源凌晨同步时。别慌,这不是你的网络问题,是 conda 服务器暂时不可用。应急三步法:

  1. 临时切到备用源

    conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
    conda clean --all  # 清理缓存,避免旧索引干扰
    
  2. 如果还不行,强制指定 URL 下载单个包
    比如你要装 numpy ,去中科大源页面 https://mirrors.ustc.edu.cn/anaconda/pkgs/main/linux-64/ 找到 numpy-1.23.5-py310h12a461a_0.tar.bz2 ,然后用 conda 直接安装:

    conda install https://mirrors.ustc.edu.cn/anaconda/pkgs/main/linux-64/numpy-1.23.5-py310h12a461a_0.tar.bz2
    
  3. 终极方案:离线安装
    在一台网络好的机器上,用 conda pack 打包整个环境:

    conda activate ml-train-v1.2
    conda pack -n ml-train-v1.2 -o ml-train-v1.2.tar.gz
    

    ml-train-v1.2.tar.gz 拷到目标机器,解压并激活:

    mkdir -p $HOME/conda-envs/ml-train-v1.2
    tar -xzf ml-train-v1.2.tar.gz -C $HOME/conda-envs/ml-train-v1.2
    source $HOME/conda-envs/ml-train-v1.2/bin/activate
    

    这招在客户内网、无外网的开发板上救过我无数次。

5.2 “ImportError: libGL.so.1: cannot open shared object file” —— OpenCV 图形界面的隐形杀手

当你在 Ubuntu 服务器(无桌面环境)上用 cv2.imshow() ,或者在 VS Code 的 Remote-SSH 里运行 OpenCV 脚本,十有八九会遇到这个报错。原因很简单: libGL.so.1 是 OpenGL 图形库,Ubuntu Server 默认不装。解决方案不是装 ubuntu-desktop (那会引入 2GB 无用包),而是只装最小依赖:

sudo apt update
sudo apt install -y libglib2.0-0 libsm6 libxext6 libxrender-dev libglib2.0-dev

如果还缺 libglib2.0-0 ,就补上: sudo apt install -y libglib2.0-0 。这四个包加起来不到 5MB,却能让 cv2.imshow() 正常弹窗。更优雅的方案是彻底放弃 GUI,改用 cv2.imwrite() 保存图片,或用 matplotlib.pyplot.imshow() 在 Jupyter 里显示——后者不依赖系统 GL 库,纯 Python 实现。

5.3 “CondaEnvironmentNotFoundError: Could not find environment” —— 环境路径被意外删除后的抢救指南

手贱 rm -rf ~/miniconda3/envs/myenv 是新人常犯的错。别重装 conda,环境元数据还在。 conda env list 会显示 myenv 的路径是 /home/user/miniconda3/envs/myenv ,但目录已空。抢救步骤:

  1. 找回环境定义
    如果你有 environment.yml ,直接 conda env create -f environment.yml 重建。
    如果没有,去 ~/miniconda3/envs/ 目录下找残留文件: ls -la ~/miniconda3/envs/myenv/ ,看是否有 conda-meta/history 文件。如果有,用 cat ~/miniconda3/envs/myenv/conda-meta/history | tail -n 20 查看最后安装的包列表,手动重建 environment.yml

  2. 如果 history 也被删了,用 conda 的备份机制
    conda 会在 ~/miniconda3/conda-meta/history 记录所有环境操作。运行:

    cat ~/miniconda3/conda-meta/history | grep "create.*myenv"
    

    找到类似 # cmd: /home/user/miniconda3/bin/conda create -n myenv python=3.10.12 的行,这就是你的创建命令。

  3. 终极恢复:从已安装包反推
    运行 conda list --explicit > spec-file.txt ,这个文件记录了当前激活环境下所有包的完整 URL 和 SHA256。把它拷到新环境里:

    conda create --name myenv --file spec-file.txt
    

    这是 conda 最强大的功能之一,文档里很少提,但它是你误删环境后的最后一道保险。

5.4 “VS Code 终端里 conda activate 不生效” —— Shell 初始化的深层陷阱

在 VS Code 集成终端里输入 conda activate myenv ,提示 CommandNotFoundError: Your shell has not been properly configured to use 'conda activate' 。这不是 VS Code 的 bug,是你 shell 的初始化逻辑没走完。根本原因是:VS Code 的集成终端默认启动的是 non-login shell,而 conda 的初始化代码(在 ~/.bashrc 末尾)只对 login shell 生效。解决方案有两个:

  • 推荐方案:在 VS Code 设置里强制启用 login shell
    打开 VS Code 设置,搜索 terminal integrated shell args linux ,点击“Add Item”,填入 -l (小写的 L)。这会让终端以 login shell 启动,自动执行 ~/.bashrc ,conda 就能正常工作。

  • 备选方案:手动 source conda 初始化脚本
    ~/.bashrc 里找到 conda 初始化段落(通常以 # >>> conda initialize >>> 开头),把它剪切出来,粘贴到 ~/.bash_profile 里。因为 ~/.bash_profile 是 login shell 的标准初始化文件,而 ~/.bashrc 是 non-login shell 的。这样无论哪种 shell 都能加载 conda。

注意:不要同时在 ~/.bashrc ~/.bash_profile 里保留 conda 初始化代码,会导致重复初始化, conda activate 时出现 CondaValueError: prefix already exists: /home/user/miniconda3/envs/myenv 的报错。

6. 进阶实践:Ubuntu + Conda 在国产化场景下的适配策略

6.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值