ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 18.04安装Anaconda完整指南:版本选择、换源加速与报错排查

Ubuntu 18.04安装Anaconda完整指南:版本选择、换源加速与报错排查 这一篇是给所有被Ubuntu18.04和Anaconda组合折磨过的朋友写的。我自己在这套系统上装Anaconda的次数已经数不清了从最早一路下一步式的安装到后来在服务器上静默部署中间踩过conda命令找不到、装完Python版本还是3.6、创建环境卡在Solving environment半天不动、以及卸载重装时目录残留导致的各种问题。这篇文章是我重新在Ubuntu18.04上完整走了一遍安装流程后整理出来的实测记录覆盖版本选择、国内下载、终端安装、环境变量、首次验证、换源加速、卸载重装和报错排查关键是每一步会产生什么界面和回显我都写出来了照着对就行。如果你是被ROS Melodic或者Autoware这类工具链绑定在18.04的用户或者是刚转Linux没多久、想把Python环境管理统一到conda的开发者这篇应该能帮你把从零到可用的时间压缩到一小时内包括下载在内。1. 安装前的盘算版本、系统与网络这三个变量1.1 为什么Ubuntu18.04这个系统值得单独说很多人觉得Ubuntu安装Anaconda不就是下载个sh脚本然后bash一下吗为什么还要单独写一篇针对18.04的教程。原因是Ubuntu18.04这个版本有点特殊。它自带的是Python 3.6而目前Anaconda官方安装包内置的Python版本早就不是3.6了有的甚至已经到3.11和更高。这意味着系统里会出现两套Python版本如果环境变量处理不好你在终端里敲python出来的还是系统自带的3.6Anaconda装了个寂寞。更关键的是Ubuntu18.04官方标准支持在2023年已经结束了但大量机器人和自动驾驶相关的工具链至今仍然锁定在这个版本上。比如ROS Melodic只支持18.04很多相机雷达联合标定工具、Autoware相关的教程也都写死在Ubuntu18.04上。这批用户在装Anaconda时遇到的问题跟普通桌面用户完全不一样他们的机器上往往还跑着ROS环境、CUDA驱动安装过程中稍有不慎就会把系统环境搞乱。另外Anaconda新版本对glibc和OpenSSL的版本要求越来越激进我在18.04上用最新版安装包时偶尔会碰到兼容性警告这在20.04和22.04上几乎不存在。所以不能直接拿一份通用教程硬套得针对18.04的软件生态选择合适版本和配置方式。1.2 版本选择Anaconda版本与Python版本的对应关系我个人的建议是先明确你要用哪个Python版本再反推选哪个Anaconda发行版而不是盲冲官网首页那个最新下载按钮。Anaconda每个版本安装包都会内置一个默认Python版本以下是几个常见对应关系Anaconda版本内置Python版本适用场景2023.09-03.11新项目、日常学习、数据科学2022.053.9稳定与ROS/标定工具链兼容性较好2021.113.9老项目、课程教学常用2020.113.8更老的课程和脚本环境2019.103.7早期项目、历史兼容如果只是日常学习或者写写数据分析选2023.09-0这种较新的版本没问题。但如果你的机器上装了ROS Melodic或者要跑Autoware相关标定工具链里的Python脚本我建议选2022.05或者2021.11。原因是很多机器人相关的Python依赖库在Python 3.11下面还没有编译好的conda包到时候conda install各种报NotFound反而折腾。这里还有一个认知需要纠正Anaconda安装包内置的Python版本并没有那么重要因为conda可以创建任意Python版本的虚拟环境。真正重要的是安装包本身的稳定性和兼容性以及初始base环境里预装的那批科学计算包够不够新。所以我的原则是不追最新只追稳定。1.3 网络环境决定下载渠道Anaconda安装包可不小常规的Linux安装包在800MB到1.1GB之间视具体版本而定。从官网下载在国内网络环境下的体验比较差我实测经常只有几十KB每秒一个包下半小时很正常中间网络一抖动就断掉心态很容易崩。所以国内用户直接推荐用清华大学开源软件镜像站来下载。镜像站地址是https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/这里面保留了几乎所有历史版本目录结构清晰文件名规律是Anaconda3-版本号-Linux-x86_64.sh。选择国内镜像下载的本质是为了减少跨国网络链路的传输损耗这是完全正常且合规的加速方式。下载完成后我还会习惯性做一下校验确保包没有在传输过程中损坏。这一点很多人省掉但我在帮同事排查问题的时候确实遇到过下载的脚本能跑、装出来的conda却各种报错的情况最后定位根因就是安装包不完整。2. 下载安装包官方渠道与国内镜像的取舍2.1 官方下载页面怎么走如果你还是想从官网下载最新版路径是打开https://www.anaconda.com/download页面往下翻找到Linux分类在64-Bit (x86_64) Installer那一行右键复制链接地址。这里我不建议直接在浏览器里点下载而是建议复制链接后在终端里用wget拉取。执行命令wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh用wget而不是浏览器下载有几个实际好处断线了可以加-c参数续传能实时看到下载速度和剩余时间而且在没有图形界面的服务器上这是唯一可行的下载方式。下载完成先看一眼文件大小ls -lh Anaconda3-2023.09-0-Linux-x86_64.sh正常情况下容量在800MB到1.1GB左右。如果文件只有几KB或者几十MB那基本可以断定下载被网络层拦截或者服务器返回了一个错误页面这种脚本后续安装必出问题趁早重新下。2.2 国内镜像站下载与wget断点续传从清华镜像站下载时先打开https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/找到你需要的版本目录然后终端直接执行wget -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh实测在镜像站下载速度能到几MB每秒一个多GB的安装包一两分钟就能拉完。这个体验和官方源相比差距是肉眼可见的。镜像站每个安装包旁边通常有对应的校验文件你可以把后缀为.md5或者.sha256的文件也一起下载下来然后执行md5sum Anaconda3-2023.09-0-Linux-x86_64.sh sha256sum Anaconda3-2023.09-0-Linux-x86_64.sh拿输出结果和官网或者镜像站标注的校验值比对一致再进入安装环节。这个过程看着多了一步其实也就十几秒但它可以帮你省掉后面排查诡异问题的大量时间。我在实际维护的几台Ubuntu18.04机器上见过两次安装脚本能跑完但conda初始化失败的情况最后查下来都是下载包不完整所以这个习惯值得养成。3. 终端安装全程每一步该输入什么、会看到什么3.1 运行安装脚本前的准备进入安装环节之前不要急着直接bash Anaconda3-xxx.sh先花几分钟确认三件事。第一是磁盘空间。Anaconda基础安装占用约3GB空间后续创建虚拟环境、安装包还会继续占用。用df -h /home确认你用户目录所在的分区剩余空间在5GB以上比较稳妥。如果空间不够安装在半路失败还不留痕迹排查起来特别麻烦。第二是确认系统里有没有bzip2这个工具。conda在解压包和创建环境的时候依赖它Ubuntu18.04最小化安装的系统里有时候没有。检查命令which bzip2如果没有输出就手动安装一下sudo apt update sudo apt install -y bzip2 wget第三是检查机器上是否已经装过Anaconda。命令ls -d ~/anaconda3 ~/anaconda2 /opt/anaconda3 2/dev/null如果这些路径全部提示不存在说明机器是干净的。如果存在先卸干净再装新的不然会出现already exists的报错后续章节会具体讲怎么处理。3.2 安装交互过程的完整解读准备完成后进入安装包所在目录执行cd ~/下载 bash Anaconda3-2023.09-0-Linux-x86_64.sh这里强调一点执行安装不要加sudo。默认安装到当前用户家目录就够用加了sudo反而会把Anaconda装到root的家目录下装完普通用户终端还是找不到conda这是新手最容易踩的坑之一。脚本启动后终端第一屏会显示类似这样的欢迎信息Welcome to Anaconda3 2023.09-0 In order to continue the installation process, please review the license agreement. Please, press ENTER to continue...直接按回车继续。接着会进入协议阅读环节协议是全英文的你可以连续按空格或者回车快速翻页也可以直接按q跳过阅读终端会提示Do you accept the license terms? [yes|no]这里必须输入完整的yes然后回车。注意不是只输入一个y部分版本的安装器脚本只识别完整单词yes只输y会被当成未接受协议直接退出安装。接受协议后安装器会询问安装路径Anaconda3 will now be installed into this location: /home/你的用户名/anaconda3 - Press ENTER to confirm the location - Press CTRL-C to abort the installation - Or specify a different location below默认路径直接回车即可。除非你的home分区确实空间不够想放到其他数据盘否则不要改。路径中避免使用中文和空格后面配置环境变量会省很多事。接下来就是进度条解包过程这一步需要几分钟到十几分钟不等取决于磁盘性能。解压完成后终端会问最后一个关键问题Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no]这里一定要输入yes。conda init做的事情是自动把初始化代码写进当前用户的shell配置文件中不管默认是bash还是zsh它都能识别。如果在这里选了no装完conda命令大概率找不到后面手动配置又容易出现PATH重复等问题。所以遇到这个提示直接yes。3.3 安装模式选择单用户与多用户Anaconda的安装模式没有图形界面里那种花哨选项核心区别只在于你用哪个用户身份执行安装脚本、把目录装到哪里。默认单用户安装是给个人开发机用的。目录在~/anaconda3PATH和初始化配置写进当前用户的.bashrc或对应shell配置里卸载也纯粹直接删目录和配置文件就行。多用户共享场景则复杂很多。如果团队服务器需要多人共用同一个Anaconda可以考虑把目录装到/opt/anaconda3然后通过用户权限管理控制访问。示例操作sudo mkdir -p /opt/anaconda3 sudo chown 你的用户名:你的用户名 /opt/anaconda3 bash Anaconda3-2023.09-0-Linux-x86_64.sh安装路径指定为/opt/anaconda3即可。但这种方案的维护成本比单用户高不少每个想用conda的用户都得在自己shell配置里单独加上PATH和conda init初始化代码否则只有安装者自己能用。而且多用户同时写同一个conda环境时还会遇到权限冲突。我的建议是除非你的使用场景非常明确是需要多用户共享否则个人开发机一律用默认单用户模式。为了一时的专业感去搞多用户后面会有很多隐性成本。4. 环境变量与shell初始化安装完成后才是关键4.1 conda命令找不到的排查定位流程安装过程走完后新开一个终端窗口输入conda --version正常情况下已经能显示版本号了因为刚才安装时选了conda init。但如果提示conda: command not found不要慌按照下面的顺序逐项排查。第一步先执行source ~/.bashrc让配置在当前终端重新加载一次。新开的终端理论上会自动加载bash配置但如果你一直在用同一个旧终端窗口测试它是在安装Anaconda之前打开的没有加载最新配置就会出现这个问题。第二步执行echo $PATH看输出里有没有/home/你的用户名/anaconda3/bin。如果没有说明PATH压根没配上直接看第三步。第三步检查~/.bashrc文件里是否存在一段以__conda_setup开头的代码块。这个是conda init生成的如果它被手动注释或者删除了conda就会从PATH中消失。手动补救的临时方案是在.bashrc末尾追加一行export PATH/home/你的用户名/anaconda3/bin:$PATH然后执行source ~/.bashrc。这个方式立竿见影但它会绕过conda自带的shell hook机制。如果后续你又运行了conda init可能出现两段初始化代码叠加的情况PATH重复导出形式上是小问题但看着难受。所以我的原则是能用conda init解决就优先conda init手动export只是应急手段。4.2 .bashrc里的conda代码块别乱动安装脚本自动写入.bashrc的代码块大致长这样# conda initialize # !! Contents within this block are managed by conda init !! __conda_setup$(/home/用户名/anaconda3/bin/conda shell.bash hook 2 /dev/null) if [ $? -eq 0 ]; then eval $__conda_setup else if [ -f /home/用户名/anaconda3/etc/profile.d/conda.sh ]; then . /home/用户名/anaconda3/etc/profile.d/conda.sh else export PATH/home/用户名/anaconda3/bin:$PATH fi fi unset __conda_setup # conda initialize 这段代码执行了一个三层兼容逻辑先通过conda自带的shell hook机制初始化当前shell如果失败就加载conda.sh脚本再不行就直接导出PATH。它保证了在各种shell环境下conda都能被找到条件是这个代码块本身不能被动过。所以我建议如果你发现自己手动改过.bashrc里相关的部分而且现在conda行为异常不要反复尝试手写PATH而是重新执行一次conda init bash让它重新生成这段代码。conda init会自己判断环境并覆盖旧配置这样比手动维护可靠得多。4.3 环境变量优先级与系统Python冲突Ubuntu18.04系统自带的Python是/usr/bin/python3.6Anaconda自带Python通常安装在你用户目录下。两个的优先级谁高取决于.bashrc文件执行完成后PATH中anaconda3/bin和/usr/bin哪个排在前面。正常情况下conda init生成的代码会在PATH前面插入anaconda3/bin所以执行which python应该输出/home/用户名/anaconda3/bin/python而python --version显示Anaconda内置版本。如果which python输出的是/usr/bin/python3或者/usr/bin/python3.6说明系统Python抢占优先级。这种时候千万不要去卸载系统PythonUbuntu的apt包管理流程依赖系统Python把它卸了系统都可能崩。正确做法是调整PATH顺序确保anaconda3/bin排在/usr/bin前面。我排查这类问题的时候会顺手看两个命令的输出echo $PATH which python python --version先看PATH里到底谁在前再看实际生效的是谁基本就能定位问题。5. 首次启动验证与conda基础操作5.1 验证安装是否真实可用安装完成并处理好环境变量后新开一个终端依次执行下面四条命令验证安装状态conda --version conda info python --version which python期望看到的输出分别是conda版本号、带base环境信息的环境详情、Anaconda内置的Python版本号、以及指向~/anaconda3/bin/python的路径。其中conda info输出内容比较多重点看几项active environment应该是baseconda version和python version应该与安装包版本一致base environment路径应该是你安装的目录。验证没问题后再执行一条conda list | head可以看到base环境里预置的包清单Anaconda默认带了numpy、pandas、scipy、matplotlib、jupyter等一大批科学计算相关库。这也是Anaconda和Miniconda最大的区别前者开箱即用后者更像一个最小启动器需要什么自己装。如果你是为了在服务器上精简部署Miniconda值得了解但本地开发我还是推荐。5.2 常用conda命令整理装完Anaconda后命令体系里最容易搞混的就是conda和pip的分工。这里给一个最简单的划分conda负责环境隔离和环境的包管理pip负责在某个已激活的环境里安装PyPI上的包。日常用到的conda命令其实不超过十条操作命令说明更新condaconda update -n base -c defaults conda升级conda自身列出环境conda env list显示所有虚拟环境带星号的是当前创建环境conda create -n py39 python3.9新建指定Python版本的环境激活环境conda activate py39进入py39环境退出环境conda deactivate回到base环境查看当前环境包conda list列出当前环境的所有包安装包conda install numpy在当前环境安装包删除环境conda remove -n py39 --all移除整个环境我在实际操作中建议大家把创建环境和安装常用包合并成一步比如conda create -n py39 python3.9 numpy pandas matplotlib jupyter -y这样环境创建完就能直接干活不用每次激活后再单独安装基础库。环境之间的包互不干扰这是conda管理Python版本的核心价值所在。5.3 创建虚拟环境隔离Python版本为什么反复强调创建虚拟环境因为一旦你开始用conda装深度学习框架或者机器人相关的库base环境会迅速变臃肿依赖冲突只是时间问题。我见过不少用户直接把所有包装进base最后conda update都可能失败只能全部重来。标准操作实例conda create -n py39 python3.9 -y conda activate py39 python --version输入应该是3.9.x。再执行which python会看到/home/用户名/anaconda3/envs/py39/bin/python这就是conda环境隔离的直观体现每个环境都是一个独立目录位于anaconda3/envs/下面里面的Python和所有依赖包都是独立的跟base环境完全不冲突。如果某个老项目需要Python3.6继续创建一个新环境conda create -n py36 python3.6 -y conda activate py36在Ubuntu18.04上系统Python恰好也是3.6这个操作反而有一个额外好处你不再需要碰系统Python所有项目依赖都在conda环境里隔离系统环境干干净净。这也是Anaconda在软件开发中最大的价值之一。6. 换源与加速为什么conda装包时快时慢6.1 为conda配置国内镜像源Anaconda官方软件源位于国外服务器在没有境外网络加速的环境下创建环境卡在Solving environment几分钟是常事。解决办法是把conda的默认channel切换到国内镜像源这里仍然推荐清华tuna仓库。在终端依次执行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执行完后查看配置文件确认cat ~/.condarcchannels列表从上到下的顺序就是channel优先级越上面的优先级越高。这里有一个老教程特别容易误导人的地方很多旧教程只配置了main和free两个channel但当前很多包尤其是社区维护的包都在conda-forge频道里缺失这个channel会导致安装时频繁报PackagesNotFoundError。所以上面的三条建议一起配上。换源完成后我通常还会跑一次conda clean -i清理索引缓存再执行一次conda update --all让base环境的包跟镜像站索引对齐。实测效果对比很明显同一个小环境官方源创建要两三分钟镜像源基本一分钟内能完成依赖解析。6.2 pip源配置conda源只解决conda install的下载问题但很多Python包你最终还是要靠pip装。pip默认走PyPI官方源国内下载同样不稳定。建议把pip也配置成清华PyPI镜像pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这条命令会把配置写入~/.config/pip/pip.conf之后所有pip install都会走镜像站不需要每次打-i参数。如果某个包只想临时走镜像安装也可以pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple需要注意的是pip源配置跟着用户走不区分conda环境。也就是说在base里配置一次所有虚拟环境里的pip都会自动使用这个镜像源这反而是好事省得逐个环境重复配置。6.3 strict_channel_priority 的作用conda配置里有一个参数叫channel_priority很多用户对它的理解比较模糊。简单说当多个channel里都包含同一个包时conda需要决定优先用哪个channel的版本。conda config --set channel_priority strictstrict模式下conda会严格按照channels列表的顺序选择包源尽量不使用低优先级channel里的包。优点是依赖解析更快、不容易引入跨channel的冲突缺点是如果高优先级channel恰好没有某个包而低优先级channel有conda会直接报NotFound而不是自动降级取包。flexible模式则相反conda允许跨channel灵活匹配装包成功率更高但代价是解析依赖的时间明显变长遇到复杂的包可能耗尽耐心。我的推荐用法是日常用strict如果你在安装深度学习框架这类有大量依赖的包时遇到依赖解析失败可以临时切换到flexible再试。这个切换成本为零配置文件改一行再建环境就行不需要装任何额外工具。7. 卸载与重装折腾中的常见坑7.1 卸载Anaconda的正确姿势网上有人教你直接rm -rf ~/anaconda3删除整个目录这样做能删掉大部分文件但删不干净。残留的配置会影响后续重装和使用。我建议的卸载步骤是第一步清理配置目录rm -rf ~/.condarc ~/.conda ~/.continuum第二步编辑~/.bashrc把conda init生成的那段代码整段删除从# conda initialize 到# conda initialize 之间的内容一个字都不留。第三步删除安装目录rm -rf ~/anaconda3如果你想重装一个新版本还有一个非常重要的前置步骤先备份旧环境的配置。旧的虚拟环境目录在~/anaconda3/envs下一旦删除安装目录这些环境就彻底没了。备份方式cp -r ~/anaconda3/envs ~/anaconda3_envs_backup或者更规范的方式是用conda env export environment.yml导出环境配置文件后续用conda env create -f environment.yml重建。第二种方式更干净但需要注意环境里如果有本地路径相关的包配置导出文件可能不完整。7.2 重新安装时bash脚本报错的应对重装场景下最常见的报错是ERROR: File or directory already exists: /home/用户名/anaconda3 If you want to replace it, please remove it first.这个提示非常明确旧安装目录没有删除干净。确认目录里没有需要保留的数据后执行rm -rf ~/anaconda3再重新运行安装脚本。还有一类报错是关于OpenSSL的conda.exceptions.CondaError: Cannot fetch a token for https://repo.anaconda.com/pkgs/main这类问题多半是旧conda源配置残留或者网络原因导致的建议先清理掉~/.condarc里的旧channel配置再重新安装。如果你是从Windows或某些浏览器下载的.sh文件可能带有CRLF换行符导致bash执行时出现奇怪解析错误用dos2unix处理一下再装sudo apt install -y dos2unix dos2unix Anaconda3-2023.09-0-Linux-x86_64.sh这个细节比较冷门但我在实际处理问题时确实遇到过记录一下。8. 实测高频报错与对应解法8.1 conda: command not found这是刚装完或者新开终端时最常见的一个报错。快速定位链路先确认conda装在哪个目录再确认该目录的bin是否在PATH里最后确认当前用户是否有权限执行。现象原因处理方式conda: command not found安装最后conda init选了no重新执行conda init或手动配置PATHconda --version显示旧版本PATH里指向旧的Anaconda查找并清理旧安装目录只有root能跑conda安装时用了sudo装到了/root以普通用户重新安装或调整PATH指向如果是在一个旧的终端窗口里执行的命令先source ~/.bashrc加载最新配置。很多情况下这一条就能解决问题。8.2 Solving environment卡住不动创建环境或者安装包时终端长时间停在Solving environment大部分情况是网络到官方channel不稳定少部分是依赖关系过于复杂。第一步CtrlC中断操作把channel源换成国内镜像具体配置回看第6章。如果已经换源仍然卡住试着把channel优先级改成flexibleconda config --set channel_priority flexible这个方法还不够的话我建议直接上mamba。mamba是conda的C重写实现依赖解析速度比原生conda快一个数量级在创建复杂环境时体验极其明显。安装方式conda install -n base -c conda-forge mamba -y之后把conda create换成mamba createconda install换成mamba install其他参数完全一致。在Anaconda生态里这算是一个实实在在的加速利器。8.3 Python环境被base抢占很多用户不希望在打开终端时自动激活base环境因为这样终端里的Python默认就是Anaconda的Python可能会干扰系统工具链的执行。我接触的机器人开发用户尤其在意这一点因为ROS Melodic的构建脚本有时会调用系统Python被base抢占后会出一些莫名其妙的兼容问题。如果你希望终端默认不激活base执行conda config --set auto_activate_base false新开终端后就不会自动进入base环境需要时手动conda activate即可。我个人在机器人开发机器上会用这个配置日常Python开发则保持默认true这个选择取决于你的日常使用场景。8.4 网络代理或SSL证书报错使用conda时偶尔会遇到类似这样的SSL报错CondaSSLError: Encountered an SSL error. Most likely a certificate verification issue.这种情况通常和镜像源配置或者代理环境变量有关。先检查当前环境里有没有残留的代理变量env | grep -i proxy如果输出了http_proxy、https_proxy、HTTP_PROXY、HTTPS_PROXY这些变量而且你实际上并没有在用一个有效的代理服务conda会误以为要经过一个不存在的代理去访问网络就会出现SSL错误或者连接超时。处理方式是把这些变量清掉unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXYUbuntu18.04上的用户特别容易遇到这个情况因为不少人之前配置过临时代理用完忘了清理导致conda各种连不上。这个排查思路可以记住遇到SSL报错先别急着重装检查环境变量往往能省下大量时间。最后分享一个我自己的使用习惯。装完Anaconda并配好源之后我会顺手执行一次conda list --explicit spec-file.txt把base环境的关键依赖导出备份后续环境坏了可以快速重建。另外如果机器上既有ROS又把Anaconda作为主力Python环境我在.bashrc里加了一个自定义函数可以一键切换是否激活conda base环境避免两边互相干扰。Anaconda的安装本身不难真正拉开体验差距的是安装之后的这些细节配置。
返回列表