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

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.11Hugging Face 的 transformers 库部分老模型加载逻辑在 3.12 下会触发新的DeprecationWarning在 CI 流水线里被当作 error 中断更现实的是你团队里那位用 Ubuntu 20.04 写了五年 shell 脚本的运维大哥看到systemd-resolved在 24.04 里默认接管 DNS 解析后把公司内网域名全搞丢当场就想重装系统。所以我的硬性规则是生产环境与开发主力机只认准 Ubuntu LTS 版本当前首选 22.04Jammy次选 20.04Focal。22.04 的内核是 5.15对 NVIDIA 525 驱动、AMD ROCm 5.7、Intel oneAPI 2023.2 全部原生友好它的 Python 默认是 3.10pip 是 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。当这两个版本在同一个进程里被 importdlopen()会先加载系统路径下的旧版 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 装的包拿到 RK3588aarch64开发板上根本跑不了——但这反而是优点它强迫你面对架构差异而不是等到部署时才发现Illegal instruction (core dumped)。Miniconda 是唯一推荐起点因为 Anaconda 太重2GB 安装包预装 250 无用包RStudio、Navigator GUI、JupyterLab 插件而 Miniconda 只有 90MB装完就是干净的 conda 命令行你要什么再conda install什么没有冗余没有幻觉。2.3 为什么不是 Docker 优先容器不是银弹Docker 确实能解决环境隔离但它把问题从“环境管理”转移到了“镜像管理”。你写一个DockerfileFROM ubuntu:22.04然后RUN apt update apt install -y python3-pip接着RUN pip install torch2.0.1cu117—— 表面看很干净。但实际呢apt update每次构建都可能拉到不同版本的libssl1.1导致 PyTorch 的 CUDA 初始化失败pip install没有锁文件下次构建可能装上torch2.0.2而你的模型权重.pt文件在 2.0.2 下加载会报RuntimeError: version_ kMaxSupportedFileFormatVersion更麻烦的是Docker 镜像体积动辄 4~5GB推送到私有仓库要十分钟CI 流水线里每次docker build都是时间黑洞。Conda 的方案是environment.yml文件里明确写死pytorch2.0.1py310_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生成锁文件最后写一个极简DockerfileCOPY 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 python3.10这种模糊命令。python3.10只指定主版本conda 会自动选3.10.12或3.10.13而这两个小版本的pip行为可能有细微差异。生产环境必须精确到 patch 版本python3.10.12。更重要的是Python 版本必须与你要装的深度学习框架严格匹配。查 PyTorch 官网的 wheel 页面 你会发现torch-2.0.1cu117-cp310-cp310-linux_x86_64.whl这个文件名里cp310就是 CPython 3.10cu117是 CUDA 11.7。所以你的环境创建命令应该是conda create -n py310-cu117 python3.10.12 conda activate py310-cu117 conda install pytorch2.0.1py310_cuda117py310h6b76c0f_0 -c pytorch注意这里用了py310_cuda117py310h6b76c0f_0这个完整 build string而不是pytorch2.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.1cu117 True 11.7如果cuda.is_available()是 False90% 的原因是 NVIDIA 驱动没装好。运行nvidia-smi如果报NVIDIA-SMI has failed because it couldnt 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但很多人只停留在“CtrlShiftP → Python: Select Interpreter”这一步选中 conda 环境的python可执行文件就以为万事大吉。这会导致两个隐形问题一是调试器debugger无法识别 conda 环境里的包import numpy报错二是终端Integrated Terminal启动时并未激活 conda 环境你得手动conda activate py310-cu117才能运行脚本。正确做法是三步走安装 Remote - WSL 或 Remote - SSH 扩展如果你在 WSL 或远程服务器上开发这是刚需。它让 VS Code 的核心进程运行在本地而 Python 解释器、终端、调试器全部跑在远程 Ubuntu 里体验和本地无异。配置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。调试器配置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 基线 - python3.10.12 - pip23.0.1 # 2. 深度学习框架指定完整 build string锁定 CUDA 版本 - pytorch2.0.1py310_cuda117py310h6b76c0f_0 - torchvision0.15.2py310_cu117he37111e_0 - torchaudio2.0.2py310_cu117h1a5923c_0 # 3. 数据处理与科学计算conda 优先pip 为辅 - numpy1.23.5py310h12a461a_0 - pandas1.5.3py310h12a461a_0 - scikit-learn1.2.2py310h12a461a_0 - pip: - datasets2.12.0 - transformers4.28.1 - accelerate0.18.0 # 4. 开发与调试工具非运行时依赖但提升效率 - jupyterlab3.6.3py310h12a461a_0 - ipykernel6.22.0py310h12a461a_0 - black23.1.0py310h12a461a_0这个文件的精妙之处在于分层第 1 层python和pip是地基决定了所有后续包的 ABI 兼容性第 2 层 PyTorch 三件套用完整 build string 锁死避免 CUDA 版本漂移第 3 层pip部分只装 conda 源里没有的包且版本号用严格锁定第 4 层是纯开发工具不影响模型运行。创建环境只需一条命令conda env create -f environment.ymlconda 会自动解析依赖图下载所有包并按顺序安装。如果中途失败比如网络中断再次运行该命令会从断点继续不会重复下载已成功的包。环境创建完成后用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 的cu117wheel 依赖的是 CUDA Toolkit 11.7 的运行时库libcudart.so.11.7而不是驱动本身。驱动driver负责与 GPU 硬件通信Toolkitruntime负责提供 CUDA API 的实现。它们的版本必须满足“向后兼容”规则驱动版本 ≥ Toolkit 要求的最低驱动版本。CUDA 11.7 要求驱动 ≥ 450.80.02而 525 驱动完全满足。但 Toolkit 本身没装你需要手动安装cuda-toolkit-11-7。Ubuntu 官方源里没有必须从 NVIDIA 官网下载.run文件或用 conda 安装conda install cudatoolkit11.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], devicecuda); print(a) # 检查 CUDA 内存分配是否正常 python -c import torch; print(torch.cuda.memory_summary())如果torch.tensor(..., devicecuda)成功执行并返回tensor([1, 2, 3], devicecuda: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(seed42): 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(fUsing 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_sizeargs.batch_size, shuffleTrue) # 构建模型 model nn.Sequential( nn.Linear(3*224*224, 128), nn.ReLU(), nn.Linear(128, 10) ).to(device) # 优化器 optimizer optim.Adam(model.parameters(), lrargs.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(fEpoch {epoch1}/{args.epochs}, Loss: {total_loss/len(train_loader):.4f}) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--batch-size, typeint, default32) parser.add_argument(--lr, typefloat, default1e-3) parser.add_argument(--epochs, typeint, default10) 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 服务器暂时不可用。应急三步法临时切到备用源conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda clean --all # 清理缓存避免旧索引干扰如果还不行强制指定 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终极方案离线安装在一台网络好的机器上用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但目录已空。抢救步骤找回环境定义如果你有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。如果 history 也被删了用 conda 的备份机制conda 会在~/miniconda3/conda-meta/history记录所有环境操作。运行cat ~/miniconda3/conda-meta/history | grep create.*myenv找到类似# cmd: /home/user/miniconda3/bin/conda create -n myenv python3.10.12的行这就是你的创建命令。终极恢复从已安装包反推运行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 启动自动执行~/.bashrcconda 就能正常工作。备选方案手动 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