Anaconda 这三个字,很多人在课程表、教程视频、师兄师姐的群里都见过,但真正动手装的时候,往往卡在第一步:下载哪个版本、装完要不要勾 PATH、装完之后怎么创建虚拟环境、创建好的环境又怎么在 PyCharm 或者 VSCode 里用起来。这些问题单看每一个都不难,凑在一起就成了一锅粥,新手最常见的结局是——系统里塞了三个 Python,命令行敲python出来的是哪一个自己都不知道。这篇内容就是围绕 Anaconda 虚拟环境搭建这一条主线,把版本选择、安装细节、镜像源配置、conda 创建虚拟环境的完整命令流、IDE 接入、环境迁移和典型报错排查一次讲透。不管你是刚接触 Python 环境搭建的零基础用户,还是已经被依赖冲突折磨过的开发者,都能直接照着做,做完手里会有一个干净、可复现、能随手删掉重来的开发环境。
1. 动手之前,先想清楚为什么要用虚拟环境
1.1 全局环境到底会踩什么坑
我刚学 Python 那会儿,所有的包都往系统自带的 Python 里装,pip install一条命令走天下,觉得挺爽。直到有一天,一个做数据清洗的项目需要 pandas 1.3,另一个跑模型的脚本依赖 pandas 2.0 里某个新参数,pip install装完 A 项目的依赖,B 项目直接报AttributeError。改回去,A 又崩。来回折腾一个下午才意识到,问题不在代码,而在于两个项目共用了一个环境。
这就是虚拟环境存在的根本原因:依赖隔离。每个项目有自己独立的包目录、独立的 Python 解释器版本,互不干扰。A 项目锁定 numpy 1.24,B 项目用 numpy 1.26,物理上互不影响。除此之外还有三个隐性好处:一是可复现,把环境导出成一份environment.yml,换台机器或者交给同事,一键还原出几乎一致的环境;二是可试错,想装个新库怕搞坏现有配置,新建一个环境装完再删,成本几乎为零;三是不污染系统,macOS 和 Linux 上系统 Python 被大量系统工具依赖,乱装包有概率把系统工具搞挂,这个后果比报错难处理得多。
新手最容易忽略的一点是:虚拟环境隔离的不只是 pip 包,还包括 Python 解释器本身的版本。有的老项目只能在 3.7 上跑,新框架又要 3.11 以上,你不可能在一台机器上同时维护两个全局 Python 版本,但可以建两个虚拟环境各用一个。这一点在后面的实操里会体现得很明显。
1.2 conda、venv、uv 到底该选哪个
Python 圈子里做环境隔离的工具不止一个,常见的有venv(Python 标准库自带)、conda(Anaconda/Miniconda 提供)、以及近两年很火的uv。它们不是替代关系,而是各有适用场景,我用一张表把差别摆出来:
| 工具 | 能管 Python 版本 | 能管非 Python 依赖 | 速度 | 适合场景 |
|---|---|---|---|---|
| venv | 否 | 否 | 中 | 纯 Python 项目,机器上已有合适版本 |
| conda | 是 | 是(CUDA、编译器、MKL 等) | 较慢 | 数据科学、深度学习、需要装二进制依赖 |
| uv | 是(可下载解释器) | 否 | 极快 | 追求速度、依赖结构干净的 Python 项目 |
这里有个关键点很多人不知道:conda 不只是 Python 包管理器。像 PyTorch 这类框架,除了 Python 包本身,还依赖 CUDA 运行时、cuDNN、MKL 数学库这些非 Python 的二进制组件,conda 可以一起装、一起管理版本匹配。你要是用 pip 装,就得自己保证驱动、CUDA、cuDNN 三方版本对得上,新手在这上面翻车的概率非常高。
所以我的建议很直接:做深度学习、数据分析、科学计算,优先用 conda 建环境;纯后端、纯脚本类项目,用 venv 或 uv 更轻快。两种方式并不冲突,你完全可以在 conda 环境里用 pip 装那些 conda 源里没有的包。至于有人问能不能只用 Miniconda,答案是完全可以,Miniconda 就是 Anaconda 的精简版,只带 conda 和 Python,其余包按需装,硬盘占用小很多,对老笔记本更友好。
提示:不要在同一台机器的同一个环境里混用 conda 和 pip 安装同一个包的依赖链,比如先用 conda 装了 numpy,又用 pip 装了个强依赖特定 numpy 版本的库,很容易出现版本被 pip 悄悄覆盖的情况。混用时建议先用 conda 装能装的,最后再用 pip 收尾。
2. Anaconda 下载与安装:版本和选项怎么定
2.1 下载渠道与版本号的选择逻辑
Anaconda 的官方发行版是滚动更新的,命名格式形如Anaconda3-2024.10-1,前面是年份月份,后面是补丁号。很多人纠结要不要装最新版,我的实际经验是:新手跟最新正式版走没问题,但如果你要复现别人的项目,先看对方文档里写的 Python 版本。
Anaconda 每个发行版会绑定一个默认 Python 版本,比如 2024 年的几个版本默认带 Python 3.11 或 3.12。如果你要做的项目明确要求 3.8 或 3.9,那也不用专门去找老安装包,因为 conda 后面可以随时创建指定版本的环境,安装包自带的 Python 版本只影响base环境。反倒是安装包本身选新的更省事,因为新版 conda 的依赖求解器更快,处理复杂依赖时卡死的情况更少。
渠道上认准两个地方就够:官方网站的下载页,以及国内的镜像站归档目录。官网下载对国内网络不太友好,几百兆的安装包经常下到一半断掉,这时候可以直接从镜像站的 archive 目录取安装包,速度差别是数量级的。文件命名里的Windows-x86_64表示 64 位 Windows,MacOSX-arm64是苹果 M 系列芯片,Linux-x86_64是常见的 64 位 Linux。选错了装不上,这一步别看花眼。
还有一个常被忽略的细节:安装包体积大概在 800MB 到 1GB 之间,装完占用 3 到 5 GB 空间。如果你的 C 盘只剩几个 G,建议换到其他盘,或者直接改用 Miniconda(安装包只有 100MB 左右),后面需要什么装什么。
2.2 安装向导里那三个勾选项的真实含义
Windows 上的安装向导会问几个问题,其中三个最关键,我逐个说清楚它们的后果。
第一个是安装类型,Just Me还是All Users。Just Me装到当前用户目录下,不需要管理员权限,路径里会带用户名;All Users装到C:\ProgramData下,需要管理员权限,多用户共用。个人电脑无脑选Just Me就行,出问题的概率最低。
第二个是安装路径。路径里绝对不能有中文、空格和特殊符号。我见过有人装到D:\我的软件\Anaconda 3,结果后面某些包在编译时找不到路径,报一堆莫名其妙的错,排查半天才发现是空格和中文惹的祸。建议就写D:\Anaconda3或者C:\Anaconda3这种干净路径。
第三个是那个让人纠结的复选框:Add Anaconda3 to my PATH environment variable。官方推荐是不勾,理由是可能覆盖系统里已有的 Python,但实际用起来,不勾就意味着你只能在开始菜单里的Anaconda Prompt里敲 conda 命令,用普通 cmd 或者 PowerShell 会提示conda 不是内部或外部命令。对新手来说这反而更困惑。我的做法是:勾上,然后自己确认系统 PATH 里原来的 Python 路径是否还在,如果不需要原来的,勾上最省事。
至于Register Anaconda3 as my default Python,这个选项一般跟着前面的 PATH 勾选自动变化,装完之后你可以随时用conda config改,不用在这里纠结。
2.3 Windows、macOS、Linux 三端安装的差异点
Windows 是图形化向导,一路下一步就行,重点就是上面三个选项。装完之后如果 cmd 里敲 conda 没反应,先关掉再重新打开终端,PATH 环境变量的刷新需要新会话才能生效。
macOS 有两种情况:Intel 芯片和 Apple Silicon。下载时要选对架构,M 系列芯片选 arm64 版本。安装方式是双击.pkg走图形向导,或者用命令行bash Anaconda3-xxxx-MacOSX-arm64.sh安装。用命令行方式时,安装脚本最后会问是否运行conda init,选 yes,它会自动往你的.zshrc或.bash_profile里写初始化代码。装完之后新开一个终端窗口,命令行提示符前面会出现(base),看到这个就算成功了。
Linux 基本只有命令行安装一种方式,适合服务器场景:
# 上传安装包后执行,-b 表示批处理模式,-p 指定安装目录 bash Anaconda3-2024.10-1-Linux-x86_64.sh -b -p $HOME/anaconda3 # 初始化 shell 配置 $HOME/anaconda3/bin/conda init bash # 让配置生效 source ~/.bashrc服务器上装完,退出重新登录一次,conda --version能输出版本号就说明环境变量写对了。Linux 上有个坑:多用户服务器里如果每个人都装了 Anaconda,.bashrc里会堆一长串初始化代码,容易互相打架,这种情况建议用conda init生成的块各自管理,不要手动往 PATH 里硬塞。
注意:如果你在 Linux 服务器上没有 root 权限,安装路径一定选自己的家目录,别去碰
/opt或/usr/local,否则安装到一半会报权限不足,且卸载时残留文件很难清理。
3. 镜像源配置:把下载速度从龟速拉回正常
3.1 为什么换源是最值得先做的一步
Anaconda 默认的包源在国外,国内直连下载速度经常只有几十 KB/s,装个 PyTorch 能等半小时,中途断流还会留下损坏的缓存,下次装直接报错。换源之后,同样的包通常几分钟就能装完,而且镜像站会同步绝大多数常用包,覆盖日常开发完全够用。
换源要分两件事做:conda 源和pip 源。这两套是独立的配置体系,只配 conda 源,用 pip 装包时还是慢;只配 pip 源,conda 装包照样卡。两个都配好,才算真正打通。国内常用的镜像有清华大学 TUNA、中科大、阿里云等,其中清华的 Anaconda 镜像同步比较及时,社区文档也全,新手用它最不容易出问题。
配置方式有两种:命令行一条条加,或者直接写配置文件。命令行方式直观但容易加乱,配置文件方式一次写清楚,推荐后者。Windows 下配置文件在C:\Users\你的用户名\.condarc,Linux 和 macOS 在~/.condarc,文件不存在就自己新建一个。
3.2 .condarc 与 pip 源的完整配置
先说 conda 的配置文件。把下面内容整段粘进.condarc:
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几个字段说明一下。default_channels把默认源整体替换成镜像地址,这样即使某个包写的是defaults,也会走镜像;custom_channels用来接管conda-forge、pytorch这些第三方频道,装深度学习框架时特别有用;show_channel_urls: true会在安装时打印每个包来自哪个源,排查问题的时候一眼就能看出是不是走了镜像。
改完执行conda clean -i清掉旧的索引缓存,再跑conda config --show channels确认配置读进去了。可以顺手测一下速度:
conda create -n speedtest python=3.10 numpy pandas如果几十秒内就建好,说明源配对了。如果卡在Solving environment很久,那多半是依赖求解的问题,不是源的问题,后面第 6 节会专门讲。
pip 源就一行命令:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set global.trusted-host pypi.tuna.tsinghua.edu.cnLinux 服务器上如果只想给当前用户配,就在用户目录下执行;想给所有用户配,加--global参数写到/etc/pip.conf。macOS 上默认 pip 命令可能指向系统 Python,记得先conda activate到目标环境再执行,否则你会把源写进系统 Python 的配置里,用的时候自己都找不到。
3.3 换源之后反而装不上的情况
配镜像源不是万能的,有两种情况会翻车。
第一种是包版本落后。镜像同步有延迟,某个包刚发布两小时的版本,镜像上可能还没有,这时候会报PackagesNotFoundError。解决办法是临时指定官方源装这一个包:
conda install -c https://repo.anaconda.com/pkgs/main 包名或者干脆等一天再装。别急着把.condarc改回去,改来改去最后自己都忘了当前是什么配置。
第二种是HTTPS 证书相关的报错,典型信息是SSLError或者CondaHTTPError。这种情况通常是本地网络环境的证书校验或者企业内网的安全策略导致的。排查顺序是先确认时间同步是否正常(系统时间错了证书必然校验失败),再尝试用 HTTP 地址替换 HTTPS 试试,最后检查是否有企业网络的访问策略限制。如果是公司内网,直接问 IT 要一份可用的源列表比自己在网上瞎试高效得多。
提示:
conda clean -a会清掉所有缓存包和索引,能释放几个 G 的空间,但下次装包要重新下载。我一般两三个月清一次,或者在磁盘告急的时候清。清理前确认没有正在进行的安装任务。
4. conda 创建与管理虚拟环境的完整命令流
4.1 从零创建一个指定版本的环境
创建环境的命令格式是conda create -n 环境名 python=版本号,比如:
conda create -n py310 python=3.10敲下去之后 conda 会先求解依赖、列出将要安装的包清单,等你输入y确认。这里有两个实用参数:-y可以跳过确认直接装,脚本化的时候有用;-n后面跟的环境名建议用英文、短、能看懂,比如cv、nlp、web,别用test1、abc这种,环境一多自己都记不住哪个是哪个。
创建时可以顺手带上常用包,一步到位:
conda create -n dl python=3.10 numpy pandas matplotlib jupyter -y比先建空环境再一个个装快得多,因为依赖求解只做一次。
创建完成后激活环境:
conda activate dl成功的话命令行提示符前面会从(base)变成(dl)。这一步看起来简单,但新手最常卡在这里——在 Windows 的 cmd 里敲conda activate报CommandNotFoundError,原因通常是没做conda init。解决方式是打开Anaconda Prompt(它自带初始化),执行:
conda init cmd.exe conda init powershell然后关掉终端重新打开,问题基本就解决了。
4.2 查看、退出、删除与克隆的日常操作
日常用得最多的几条命令,我列成一张表方便查:
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看所有环境 | conda env list | 带星号的是当前激活的环境 |
| 查看某环境装了哪些包 | conda list -n dl | 不激活也能查 |
| 退出当前环境 | conda deactivate | 连敲两次回到 base |
| 删除整个环境 | conda remove -n dl --all | 慎用,不可恢复 |
| 克隆环境 | conda create -n dl2 --clone dl | 用于做实验前的备份 |
| 重命名环境 | conda rename -n dl dl_backup | 需要较新版本 conda |
| 清理缓存 | conda clean -a | 释放磁盘空间 |
这里面我最想强调克隆这个操作。当你已经调好一个能跑通项目的环境,接下来想试一个新库,别直接往原环境里装,先--clone一份出来,在新环境里折腾。搞崩了大不了删掉新环境,原环境毫发无损。这个习惯帮我省了无数次重装的时间。
重命名环境在旧版 conda 里没有rename子命令,得用clone加remove两步走,或者装conda-rename插件。如果你敲conda rename报错说不认识这个命令,先跑conda --version看版本,再决定用哪种方式。
还有一点,删除环境之后磁盘空间不会立刻释放,因为包缓存还在pkgs目录里。真要回收空间,得配合conda clean -a。
4.3 环境默认装在 C 盘怎么办
conda 默认把环境建在安装目录下的envs文件夹里,如果 Anaconda 装在 C 盘,那么每建一个环境,少则几百兆、多则几个 G 全往 C 盘塞。深度学习环境一个就 5G 往上,三四个下来 C 盘直接飘红。
解决办法是修改环境的默认存放路径,把envs_dirs和pkgs_dirs两个配置改掉:
conda config --add envs_dirs D:\conda_envs conda config --add pkgs_dirs D:\conda_pkgs执行完可以用conda config --show envs_dirs查看,新加的路径会排在列表第一位,也就是优先使用的位置。注意envs_dirs是列表,可以加多个,conda 会按顺序找。
这里有个坑:已经创建的环境不会自动搬过去,只对之后新建的环境生效。老环境想迁移,要么删掉重建,要么用conda create --clone到新路径下再删旧的。还有一个更隐蔽的问题:如果你把D:\conda_envs加进去之后发现新环境还是建在 C 盘,检查一下是不是之前手动在 C 盘的环境名冲突了,或者.condarc里envs_dirs的顺序被别的配置顶掉了。
Linux 服务器上同理,把路径设成/home/用户名/conda_envs这类不占系统盘的位置,能避免系统盘被写满导致服务异常。
4.4 环境导出与迁移的三种方案
把环境交给别人、换机器、上服务器,这是必然会遇到的需求。三种方案,按场景选。
方案一:导出 yml 文件,适合对方有网络、能从源装包的情况。
# 导出,包含精确版本号 conda env export > environment.yml # 跨平台导出,去掉平台相关的 build 号 conda env export --no-builds > environment.yml # 对方还原 conda env create -f environment.yml--no-builds这个参数很重要。默认导出的文件里带一堆build字段,形如numpy=1.24.3=py311h5f7f5b2_0,这个后缀和平台强绑定,Windows 导出的拿到 Linux 上装,多半找不到匹配的 build,直接报错。去掉之后只保留版本号,跨平台成功率高很多。
方案二:conda-pack 打包,适合目标机器完全没网络。
conda install -c conda-forge conda-pack conda pack -n dl -o dl.tar.gz # 目标机器上解压后激活 mkdir -p ~/envs/dl && tar -xzf dl.tar.gz -C ~/envs/dl source ~/envs/dl/bin/activate conda-unpack这套流程把整个环境连二进制文件一起打包,解压即用,不依赖网络。缺点是包体积大,而且跨操作系统不可用——Linux 上打的包只能在 Linux 上用。
方案三:pip 离线包,适合只有 pip 依赖、需要精确控制的场景。
# 有网络的机器上,下载所有依赖的 whl 文件 pip download -d ./offline_pkgs -r requirements.txt # 拷到目标机器后离线安装 pip install --no-index --find-links=./offline_pkgs -r requirements.txt这个方式最灵活,但也最容易因为平台差异出问题。注意pip download时要加上和目�标机器一致的平台参数,比如--platform manylinux2014_x86_64 --python-version 3.10 --only-binary=:all:,否则下载下来的是你当前平台的包,拷过去装不上。
5. 把 conda 环境接进 PyCharm 和 VSCode
5.1 PyCharm 里配置 conda 解释器的完整路径
环境建好了,代码编辑器里还得指明用哪个解释器,否则 PyCharm 会自作主张新建一个 venv,你装到 conda 环境里的包它一个也看不见。
操作路径是:File → Settings → Project → Python Interpreter(macOS 在PyCharm → Preferences下),点右上角齿轮或Add Interpreter,选择Conda Environment,然后勾Existing environment,在Interpreter那一栏里找到你环境的python可执行文件。
Windows 上的路径形如D:\conda_envs\dl\python.exe,Linux 和 macOS 上是~/conda_envs/dl/bin/python。选完之后 PyCharm 会读一遍环境里的包列表,装过的 numpy、pandas 都会列出来,看到这个就说明接对了。
如果列表是空的,或者提示找不到 conda 可执行文件,检查两点:一是conda命令本身在终端里能不能用;二是 PyCharm 里 conda 可执行文件的路径有没有指定对,Windows 是Scripts\conda.exe,Linux/macOS 是bin/conda。这两个填对,基本不会出问题。
新建项目的时候,PyCharm 有一个Previously configured interpreter选项,可以直接复用已有环境,比每次新建 venv 省事得多。团队协作时,我会把环境名和 python 版本写在 README 里,新人照着建一个同名的,解释器路径完全一致,省去沟通成本。
5.2 VSCode 选择解释器的几个细节
VSCode 本身不带环境管理,靠 Python 扩展。装好Python扩展之后,按Ctrl+Shift+P打开命令面板,输入Python: Select Interpreter,列表里会列出所有被识别到的 conda 环境,名字后面通常带conda标签。选中的环境会记在项目的.vscode/settings.json里,只对当前工作区生效,这一点比 PyCharm 更适合多项目并行。
如果列表里找不到你的环境,通常是三个原因之一:环境建在非常规路径下,扩展没扫到;VSCode 是在环境创建之前打开的,需要重启窗口;Python 扩展配置里禁用了 conda 环境的自动发现。
解决方式是手动输入解释器路径:命令面板里选Enter interpreter path,然后填完整路径。填入之后可以按Ctrl+Shift+开一个新终端,终端左上角会显示当前激活的环境名,conda env list也能看到星号在正确的位置。
VSCode 的集成终端有个细节值得说:默认终端是 PowerShell 时,某些版本的 conda 初始化脚本在 PowerShell 里执行策略受限,会提示无法加载文件...因为在此系统上禁止运行脚本。这时候在 PowerShell 里执行一次:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned确认之后重启 VSCode,激活就正常了。
5.3 终端显示 (base) 和环境错乱的排查
装完 Anaconda,每次打开终端都自动激活(base),有人觉得碍眼。关掉自动激活的命令是:
conda config --set auto_activate_base false改完之后 base 环境仍然存在,只是不再自动激活,需要时手动conda activate base即可。
另一个常见困扰是命令行里的 python 和环境里的 python 不是同一个。表现是:明明激活了环境,pip install装的包却在另一个 Python 里。排查方法是在终端里依次执行:
which python # Linux/macOS where python # Windows pip -V看输出的路径是否指向conda_envs\你的环境名\。如果不是,说明 PATH 顺序有问题,或者环境没真正激活。Windows 上还有一种情况是装了多个 Python 并且都写进了 PATH,这时候where python会输出好几行,排在前面的是实际生效的那个。
注意:不要在激活了 A 环境的情况下用
pip install装到一半再conda activate B,两个终端的 PATH 是相互独立的,混着操作很容易把包装错地方。养成习惯:装包之前先敲一次which python或者where python确认位置。
6. 常见报错与排查速查表
6.1 命令找不到与激活失败
conda 不是内部或外部命令、conda: command not found是最常见的第一个坎。原因分两种:安装时没勾 PATH,或者勾了但终端没有重新打开。前者去Anaconda Prompt(Windows)里执行conda init,或者手动把三个路径加进系统环境变量:
D:\Anaconda3 D:\Anaconda3\Scripts D:\Anaconda3\Library\bin三个路径缺一个都可能出问题,尤其是Library\bin,少它的话 import 某些库会报 DLL 加载失败。Linux 上则是往~/.bashrc里加export PATH=$HOME/anaconda3/bin:$PATH,然后source ~/.bashrc。
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'这个报错,本质是 shell 没有执行 conda 的初始化脚本。Windows 上跑conda init cmd.exe或者conda init powershell,Linux/macOS 上跑conda init bash或conda init zsh,然后重开终端。注意conda init会往你的 shell 配置文件里写一段代码,如果之前手动加过 PATH,可能重复,执行之后打开配置文件看一眼有没有冗余项。
6.2 依赖求解卡死与包找不到
Solving environment: failed或者卡在Solving environment十几分钟不动,是 conda 最让人崩溃的体验。原因通常是依赖约束过于复杂,求解器在尝试各种组合。几个可用的对策:
第一,指定具体版本号。conda install pytorch让求解器自己去挑版本,范围太大;conda install pytorch=2.0.1把范围收窄,速度快很多。
第二,减少不必要频道。频道路数越多,候选组合越多,求解越慢。.condarc里保留defaults和必要的conda-forge就够了,别加一堆第三方频道。
第三,换用 libmamba 求解器,新版 conda 已经默认启用了,如果你的版本比较老,可以手动装:
conda install -n base conda-libmamba-solver conda config --set solver libmamba实测下来,同一个环境用默认求解器要几分钟,换 libmamba 之后十几秒就出结果,差距非常明显。
PackagesNotFoundError: The following packages are not available from current channels一般有两个原因:包名拼错了(这是最常见的,比如sklearn其实是scikit-learn),或者当前频道里确实没有这个包。后者加上-c conda-forge再试,实在没有就用 pip 装。
6.3 问题速查表
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| conda 命令找不到 | 未初始化或 PATH 未包含 | conda init或手动加三个路径 |
| activate 报 CommandNotFound | shell 未配置 | 对应 shell 执行conda init |
| Solving environment 卡住 | 依赖约束复杂 | 指定版本号、减少频道、换 libmamba |
| PackagesNotFoundError | 包名错或频道缺包 | 核对包名、加-c conda-forge |
| SSLError / HTTPError | 证书或网络策略 | 检查系统时间、换源、问内网管理员 |
| PermissionError | 权限不足或杀软拦截 | 用管理员运行、临时关杀软 |
| 装了包但 import 失败 | 装到了别的环境 | which python确认位置 |
| C 盘空间告急 | 环境默认在安装目录 | 改envs_dirs和pkgs_dirs |
| 导出 yml 在别的机器装不上 | build 号平台绑定 | 用--no-builds重新导出 |
| 终端一直显示 (base) | 自动激活开关 | conda config --set auto_activate_base false |
这张表我建议存一份,新手期能省下大量搜索时间。里面每一条我都实际遇到过,尤其是"装了包但 import 失败"和"C 盘空间告急"这两条,几乎人人都踩。
7. 一套可以直接抄的 PyTorch 环境搭建流程
7.1 从空环境到跑通验证的最小步骤
前面讲的都是零件,这里把它们串成一条完整的流程。以搭建 PyTorch 环境为例,从零开始:
# 1. 建环境,Python 版本按框架要求选,PyTorch 2.x 建议 3.10 以上 conda create -n pytorch python=3.10 -y # 2. 激活 conda activate pytorch # 3. 确认当前 pip 和 python 指向本环境 which python && pip -V # 4. 安装 PyTorch,pytorch-cuda 的版本要和你的显卡驱动匹配 conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia -y # 5. 验证 python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"第 4 步的pytorch-cuda=11.8不是随便写的。你的显卡能支持的 CUDA 版本上限由驱动决定,用nvidia-smi查看右上角的CUDA Version,比如显示 12.1,那你可以装 11.8 或 12.1 的版本,但装 12.4 就会报错。这一步选错,torch.cuda.is_available()会返回 False,代码只能跑在 CPU 上,训练速度差几十倍。
如果 conda 装不上或者速度太慢,改用 pip 也可以,官方给的命令形如:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118注意这里的cu118对应 CUDA 11.8,cu121对应 12.1,要和驱动匹配。pip 装的包不经过 conda 的依赖管理,好处是快,坏处是 CUDA 运行时会被一并打包进 whl 里,环境体积会大一些,但省心。
验证通过之后,把环境导出成文件存档:
conda env export --no-builds > pytorch_env.yml这样哪天环境玩崩了,删掉重建只要一条conda env create -f pytorch_env.yml。
7.2 环境搭完之后值得养成的几个习惯
第一,每个项目一个环境,环境名带项目前缀。做图像分类的项目就叫cv_cls,做文本分类的叫nlp_cls,一眼能看出归属。别怕环境多,一个环境几个 G 是正常的,硬盘比时间便宜。
第二,装包前先记录。我习惯在项目根目录维护一个requirements.txt,每次装新包就补一行,用pip freeze > requirements.txt反而会把一堆间接依赖全写进去,版本锁死之后换平台反而麻烦。手动维护核心依赖,配合 conda 的 yml,两边都有记录。
第三,不要把环境当仓库用。有人一个环境里装了几十个包,跑什么都用这一个,时间长了必然出现版本冲突。隔离的意义就在于用的时候建、不用的时候删,别舍不得。
第四,定期conda clean -a。包缓存目录会随着时间越滚越大,我见过一个用了一年多的机器,pkgs目录占了 30 多个 G。清理之后再重建环境,实际耗时并不会增加多少。
最后分享一个我自己踩过的坑:有次在服务器上跑训练,环境里装了某个包的两个版本(一个 conda 装的,一个 pip 装的),代码里 import 的时候加载的是 pip 那个老版本,结果行为跟文档完全对不上,查了两个小时才反应过来。从那以后,我在环境里严格执行一条规则——同一个包只用一种方式装,能用 conda 就用 conda,conda 没有的再用 pip,装完之后用conda list | grep 包名和pip list | grep 包名都查一遍,确认没有重复。这个习惯看起来啰嗦,但能避免大量"代码明明对但结果不对"的玄学问题。