Ubuntu 20.04 上 Miniconda 安装与 conda 环境管理实战指南
一台全新的 Ubuntu 20.04 机器最有价值的前五分钟不是急着搭服务而是先把 Python 环境的上层建筑理清楚。我自己的习惯是拿到服务器第一件事就把 Miniconda 装好并且装之前先摸清系统里已有的 Python免得后面项目一多就乱套。这篇文章就按照我实际重装多次机器后沉淀下来的流程整理覆盖 Ubuntu 20.04 上快速安装 Miniconda、初始化 shell、配置环境源、日常环境管理和常见报错排查照着做基本十分钟内能把开发底座立起来已经装过的也可以直接翻到后面的踩坑章节对照。1. 为什么 Ubuntu 20.04 推荐用 Miniconda 而不是其他方案1.1 系统 Python 与全局 pip 的问题到底出在哪很多人一开始觉得装 Python 很简单执行一句apt install python3就算完成。但真正进入开发阶段会发现系统自带的 Python 和项目需要的 Python 版本经常对不上比如系统里可能是 3.8而项目里要 3.9本地调试没问题部署到新机器就各种缺包、版本不一致。再加上全局 pip 安装的库一旦多了A 项目需要的 Django 3.2 会被 B 项目升级到 4.1轻则警告重则整个项目跑不起来。这个问题在长期维护多个项目时特别明显我见过不止一个人为了不破坏全局环境每次都要单独虚拟环境但虚拟环境本身又依赖系统 Python版本隔离做得并不彻底。Miniconda 解决的正是这个层面的事。它是一个 Python 发行版管理工具通过 conda 创建完全独立的虚拟环境每个环境里可以指定 Python 版本也包含独立的库集合。环境之间互不干扰删除环境就是conda env remove不会碰系统目录也不影响全局 Python。这种“环境即项目”的思路在多机部署、实验复现、版本回退这些场景里非常实用。1.2 Miniconda 与 Anaconda、venv 的取舍对比不少新手会纠结到底装 Anaconda 还是 Miniconda或者直接用标准库里的 venv。我给一个很直观的比喻Anaconda 像一个装满工具的搬家货车Miniconda 是一辆只带了引擎和方向盘的改装车而 venv 只是给已有房子加了一间房间。Anaconda 安装完动辄几个 GB里面预装了几百个科学计算包看着方便实际上大部分都用不上Miniconda 只有基础的 Python 和 conda 本体想用什么包再手动装干净而且迁移成本低。venv 是 Python 自带的虚拟环境方案优点是不用装额外软件但它不能直接选择 Python 版本。如果系统 Python 是 3.8venv 里也只能用 3.8要换版本还得先安装对应 Python。conda 可以在创建环境时指定python3.9、python3.10会自己去下载对应解释器这对需要测试多个 Python 版本的人来说非常省事。对比项MinicondaAnacondavenv安装体积小基础约几百 MB大通常数 GB极小随 Python 自带Python 版本管理支持创建环境时可指定支持但用户少用受限依赖系统 Python包管理conda pipconda pippip适用场景日常开发、多项目隔离、服务器部署数据分析全家桶、离线安装简单项目快速隔离我一般只在临时跑一个脚本的时候用 venv只要涉及多个项目并存、需要切换版本或者部署到别的机器都优先 Miniconda。1.3 什么场景下装 Miniconda 最划算从实际看最需要 Miniconda 的是这几类人做数据处理和机器学习实验的需要频繁安装 numpy、pandas、PyTorch 这类重依赖做应用开发但同一个服务器上要维护多个服务的每个服务最好独立环境还有长期在服务器和本地电脑之间同步项目的用 conda 导出环境文件可以一键还原依赖。如果是公司内部统一管理 Python 角度Miniconda 也方便做模板化和标准化把环境配置文件放到仓库里新机器拉下来执行两句命令就能复现。如果你是新手刚上手 Linux 没几天我更建议先装 Miniconda 再学 Python 环境概念因为它把很多底层的虚拟环境细节封装掉了平时只要记住“先激活再装包装错环境先退出”就够了。2. 安装前的系统检查与安装包准备2.1 先确认内核架构和磁盘空间安装 Miniconda 前先确认两件事系统是不是 20.04CPU 是什么架构。用以下命令查看cat /etc/os-release uname -muname -m输出x86_64时下载对应 x86_64 的安装包如果输出aarch64就要找 ARM64 版本的安装包不能用同一脚本。我见过有人拿 x86 的包在 ARM 机器上执行报错以后追查半天才发现是架构不匹配。再顺手看一眼磁盘空间df -h ~Miniconda 安装后占用不大但环境和包装多了以后会涨得很快给主目录留至少 10 GB 会比较舒服。如果主目录空间紧张后面可以把 conda 的 envs_dirs 和 pkgs_dirs 指到数据盘这个后面会提到。2.2 下载对应版本的安装脚本下载安装包有好几种方式最直接的是用wget拉到服务器本地。wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh如果你在本地浏览器已经下载好了也可以用scp传到服务器scp Miniconda3-latest-Linux-x86_64.sh userserver_ip:~/不建议在服务器上用curl直接把脚本管道给 bash 执行也就是curl ... | bash那种写法。虽然省事但一旦下载中断脚本会半截卡住而且中间没有让你确认安装路径的机会出问题时很难定位。正确做法永远是先下载到本地确认文件完整再手动执行脚本。2.3 校验哈希防止文件损坏或被替换下载完以后花十秒钟做一次校验这一步很容易被忽略但真的很重要。系统自带sha256sum命令sha256sum Miniconda3-latest-Linux-x86_64.sh执行后会输出一串 64 位的十六进制字符串。把这段字符串和官方发布页面给的值对一下一致再继续。万一值不一致说明文件在下载过程中损坏或者源有问题重新下一份再说。我之前在一个内网环境里下载网络抖动导致文件少了几十个字节直接执行安装脚本时报了语法错误后来养成习惯下载完成先校验哈希再也没出过这种问题。2.4 提前想好安装位置和管理用户Miniconda 默认安装到执行脚本的当前用户主目录下路径是~/miniconda3。这里强烈建议不要用sudo执行安装脚本也不要安装在/usr/local这类系统目录下。原因很实际conda 安装包时会修改环境变量、写入用户目录的配置文件如果装在 root 或者系统目录下普通用户没法用权限问题会非常繁琐。我通常的做法是创建一个专门做开发任务的普通用户比如devuser在这个用户的 home 目录里安装 Miniconda后续所有 conda 环境都在这个用户权限内管理。多用户环境下每位用户可以在自己的主目录装一份互不影响。如果你确实需要全局共享建议先了解清楚再用 root 权限手动调整 PATH而不是无脑执行安装器。3. 五条命令完成 Miniconda 安装与基础配置3.1 进入交互安装流程并填入关键选项在安装包所在目录执行bash Miniconda3-latest-Linux-x86_64.sh脚本启动后首先是 license 协议会显示一大段文字。这里按空格往下翻页或者直接按q跳过完整阅读界面会问你是否接受协议。此时输入yes并回车。接下来脚本会询问安装位置默认是~/miniconda3直接回车用默认路径就行。少数情况你想装到别的目录比如/data/soft/miniconda3就在这里输入具体路径。需要注意后面所有 conda 相关的初始化配置都会以这个路径为基础随意修改目录以后命令会失效。然后脚本会问是否运行conda init这里也要输入yes。它的作用是往你当前的 shell 配置文件中写入 conda 初始化脚本比如~/.bashrc让你新打开的终端里直接能使用conda命令。如果这里选 no之后每次用 conda 都要手动 source 一段脚本很麻烦所以新安装时统一建议 yes。3.2 重新加载配置并确认版本号安装完成后执行以下命令刷新当前终端的配置source ~/.bashrc然后验证conda --version正常情况下会显示类似conda 24.x.x的版本号。如果提示找不到conda先确认安装路径下有没有bin/conda这个文件然后再检查~/.bashrc末尾有没有 conda 初始化的内容。这些排查步骤在后面的常见问题里会展开讲。有一点要注意装完 Miniconda 后默认情况下每打开一个终端都会自动进入 base 环境并且命令行前面会出现(base)前缀。不习惯的话可以在后面用一条命令关掉自动激活这个因人而异。对只想在需要环境时手动激活的人基环境的默认显示是多余的。3.3 配置软件包下载源解决速度慢和下载失败Miniconda 默认的软件包下载地址在境外国内网络环境下经常很慢动不动超时。我一般在装完第一时间就配好镜像源写进~/.condarc文件。执行以下命令可以添加自定义频道conda config --add channels https://mirrors.example.com/anaconda/pkgs/main conda config --add channels https://mirrors.example.com/anaconda/pkgs/free conda config --set show_channel_urls yes这里mirrors.example.com要替换成你实际可用的镜像地址。不同镜像的路径格式略有差异比如有的站点把 conda 仓库放在/anaconda/pkgs/main有的放在/conda-forge安装前最好先看一下对应镜像的使用说明确认路径后再写配置。配置完成后可以用conda config --show channels查看当前频道列表确认优先级符合预期。做这个操作时我有个习惯建环境安装第一个包之前就先配好不然第一次安装就在那边转圈体验很差。镜像配置好之后大部分 conda 包都能顺畅下载。3.4 验证安装结果并测试环境创建装完之后的验证不要只盯着conda --version还要确认当前 Python 指向的是 Miniconda 自带的版本而不是系统的。which python python --version如果系统里原本没有 Python装完 Miniconda 后which python应该输出~/miniconda3/bin/python。如果指向的是/usr/bin/python说明 PATH 的优先级没有调整好需要检查~/.bashrc里 conda 初始化块的位置确保它把 Miniconda 的 bin 目录放在了前面。接着创建第一个测试环境验证环境管理器本身可用conda create -n test_env python3.9 -y conda activate test_env python --version能正常打印Python 3.9.x说明整个安装链路已经通了。确认没问题后可以再把这个测试环境删掉conda deactivate conda remove -n test_env --all这样做的好处是之后你可以在一个干净的 base 基础上开始正式项目。4. conda 环境管理与包管理的日常操作4.1 别把项目装进 base第一时间建独立环境很多初学者装完 Miniconda 以后直接在 base 环境里conda install各种包结果环境越来越臃肿最后出问题了都不知道怎么排查。正确的习惯是每接手一个项目就创建一个独立环境名字和项目相关就好比如conda create -n myproj python3.9 conda activate myproj创建环境时可以指定不同的 Python 版本。Python 版本的选择会影响很多依赖是否能直接安装所以尽量在创建时想清楚。如果项目暂时没有特别要求选当前主流的稳定版即可。激活环境后命令行前缀会变成(myproj)后面执行的pip install、python都会在这个环境里生效。用完了执行conda deactivate返回 base再也不要使用全局 pip 往系统或 base 里乱装包。4.2 conda install 和 pip install 到底怎么选这个问题我几乎每次都会被问。简单说能用 conda 装的优先用 conda 装conda 找不到的再用 pip。情况推荐方式理由常见科学计算库conda install numpy pandas scipyconda 会自动处理二进制依赖和版本兼容需要指定频道conda install -c conda-forge opencvconda-forge 里有大量预编译包conda 搜索不到的库pip install 包名pip 的 PyPI 覆盖面更广只在本环境装先conda activate env再执行pip install确保不会污染其他环境日常使用建议先conda search 包名看看仓库里有没有有就直接conda install没有再用pip install。这样大部分情况下会少踩很多编译坑因为 conda 安装的包会携带编译好的二进制包pip 在部分场景下会现场编译耗时又容易缺依赖。4.3 环境导出、复制和批量还原多台机器之间同步环境是 conda 最省心的功能之一。在项目环境激活状态下执行conda env export environment.yml这个文件会把当前环境中的所有包和版本列出来。到另一台机器上先安装好 Miniconda然后执行conda env create -f environment.yml就能按原样恢复环境。注意conda env export会把一些本地路径信息也写进去给别人复现时可以先检查一下文件内容必要时只导出手动安装的核心依赖。也可以用conda list --explicit spec-file.txt生成更精确的依赖清单再通过conda create --file spec-file.txt -n env_name还原。如果你只是想快速复制一个环境不关心导出文件conda create --clone myproj -n myproj_backup这个方法在给项目做快照时非常实用比重新建环境再装包快得多。4.4 常用命令速查背下来能少查好几次文档看环境列表用conda env list它会显示所有环境路径带*的是当前激活环境。搜索包用conda search 包名。查看当前环境已安装包用conda list。升级某个环境里的所有包用conda update --all这个命令执行前最好确认当前环境是项目环境而不是 base不然会把 base 也一起升级。删除整个环境用conda remove -n 环境名 --all不会删除项目代码只删除环境虚拟目录和相关依赖。想看具体某一个包的依赖关系用conda info 包名能列出它的依赖链排查冲突时很关键。5. 常见安装错误排查与避坑实录5.1 输入 conda 提示 command not found这个报错在安装完成后最容易出现。原因通常是安装时选择了不执行conda init或者当前用户的 shell 配置文件里没有加载 conda 初始化脚本。先检查~/.bashrc末尾有没有类似下面的内容# conda initialize ... # conda initialize 如果没有可以手动把 conda 初始化补充进去~/miniconda3/bin/conda init bash然后重新source ~/.bashrc。如果你用的是 zsh就把 bash 换成 zsh~/miniconda3/bin/conda init zsh还有一种是当前安装路径不在默认位置初始化脚本里的路径写错了这种情况直接编辑对应配置文件里的路径或者重新执行conda init覆盖一次即可。5.2 安装完成后命令行自动带上 (base)看着不舒服这是默认行为不算报错但很多从 venv 切过来的人不习惯。如果希望每开一个终端都回到干净的命令行执行conda config --set auto_activate_base false设置以后新终端不会自动进入 base但你手动执行conda activate 环境名仍然有效。如果你更依赖自动进入 base就保持默认。我个人的做法是关闭自动激活因为很多运维脚本里面不希望无端多一个(base)环境导致 Python 指向变化。5.3 conda 下载包一直转圈或者连接超时大部分情况是默认源太慢。先确认当前配置conda config --show channels看看频道列表里是否已经配置了可用镜像如果还是官方地址参照前文重新添加镜像频道。配置完成后再试还有问题可以用conda clean -i清理索引缓存很多时候更新了配置但缓存没刷新仍然连旧地址。如果是公司网络环境需要走 HTTP 代理的话可以在命令前设置代理环境变量export https_proxyhttp://proxy_host:port export http_proxyhttp://proxy_host:port这里只讲标准做法实际代理地址以你自己网络环境为准。千万别去折腾系统网络层面先确认代理变量是否生效简单命令测试能连通后再跑 conda。5.4 pip 和 conda 装出来的库不在同一个环境里这是新手最容易误判的问题。你在命令行里明明pip list能看到某个包但 Python 代码 import 就是报错。出现这种诡异现象先确认当前 Python 路径which python pip --version如果 pip 指向系统目录而 python 指向 Miniconda说明 shell 环境里 PATH 顺序混乱。正常激活 conda 环境后which pip应该指向环境目录下的 pip。解决办法是先执行conda activate 环境名再查看路径。如果激活后仍然不对可能是初始化脚本没有正确写入回到第一个问题重新初始化。5.5 卸载 Miniconda 的正确姿势如果不想要 Miniconda 了千万别只把安装目录删掉就算完。残留的配置文件会导致新装其他 Python 工具时发生莫名路径错乱。完整的清理步骤是这样的先退出所有 conda 环境直接关闭终端也行然后删除安装目录rm -rf ~/miniconda3接着编辑~/.bashrc把 conda 初始化块整段删除。再删除用户目录下这两个文件rm -rf ~/.conda rm -f ~/.condarc做完这些后打开新终端确认conda命令已经不存在。这种清理方式不会碰系统 Python项目代码也还在只是把 conda 依赖层移除了。6. 让 Miniconda 配合 Jupyter 和 IDE 一起工作6.1 给 Jupyter Notebook 增加项目环境内核Miniconda 本身不带 Jupyter需要按需安装。在目标环境激活状态下执行conda install jupyter ipykernel然后在同一个环境里把内核注册到 Jupyter 中python -m ipykernel install --user --name myproj --display-name Python (myproj)这样启动 Jupyter 后新建笔记本时就可以从内核列表里选择Python (myproj)每个 notebook 对应一个环境互不混淆。如果你有多个环境最好分别注册名称起得容易识别一点不然时间长了根本分不清哪个内核对应哪个项目。6.2 在 IDE 和编辑器中选择 Miniconda 里的解释器主流的编辑器基本都能自定义项目解释器。以常见的 Python 开发编辑器为例创建项目时选择“现有解释器”路径指到~/miniconda3/envs/myproj/bin/python这样项目内的脚本、调试器和自动补全都使用指定 conda 环境。不用在终端里手动激活编辑器会自己拉起环境。如果是从命令行启动编辑器就先conda activate myproj再启动这样编辑器继承当前 PATH 环境也会默认使用当前环境解释器。我自己的习惯是命令行启动一个环境编辑器里也切到对应环境所有工具指向同一个 Python极少出现“终端里能跑、编辑器跑不了”的幺蛾子。6.3 多机迁移时的环境备份建议要在另一台服务器复现环境最可靠的做法不是直接拷贝~/miniconda3整个目录。除非两台机器架构和系统版本完全一致否则拷过去后很可能会出现二进制不兼容。正确做法是把依赖打进文件在目标机器上重建conda activate myproj conda env export environment.yml把这个文件放到项目仓库里新机器上执行conda env create -f environment.yml如果有些包只能通过 pip 安装导出文件里也能看到pip章节。为了确保 pip 依赖也一并还原建议在environment.yml所在目录写一个 requirements.txt把纯 pip 包单独列一下安装环境后手动补一遍也行。6.4 长期使用的一点个人心得装好 Miniconda 不是终点真正要养成的是环境意识。我踩过最深的坑是在 base 里积累了几百个包后来完全忘了哪些是跑哪个项目用的最后只能留一个干净 base 重新梳理。从那以后我定了一条规矩任何新项目哪怕只是写一个三四十行的脚本也先conda create -n 项目名 python版本号脚本跑完可以再删环境但依赖痕迹必须留在环境里。这样即使半年后再看这个项目也能根据环境文件快速恢复而不是靠记忆猜版本。还有一个小技巧每完成一个阶段的开发就把当前环境的conda list --explicit spec-file.txt存一份到项目目录。这相当于给环境做了快照以后调不下去的时候回滚非常方便。依赖管理这件事越早开始规范后面越省心。