ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Anaconda虚拟环境管理实战:从创建、换源到PyCharm/VSCode对接

2026/9/21 1:51:25 拓冰建站 浏览量
Anaconda虚拟环境管理实战:从创建、换源到PyCharm/VSCode对接 1. 为什么我不推荐你在 base 环境里直接装包刚接触 Python 那会儿我干过一件现在想起来还后怕的事把所有库一股脑全装在 Anaconda 的 base 环境里。结果半年后base 环境里躺着两百多个包numpy 版本被反复覆盖某个项目要用的 pandas 是 1.3另一个项目死活要 2.0最后连 conda 自己都开始报依赖冲突只能把整个 Anaconda 卸了重装。那次教训让我彻底明白一件事——虚拟环境不是可选项是必修课。所谓虚拟环境说白了就是给每个项目单独划一块地地里种什么、施什么肥互不干扰。你在 A 项目里装 PyTorch 2.0在 B 项目里装 PyTorch 1.13两个环境各自独立谁也不会把谁的依赖顶掉。Anaconda 自带的 conda 就是干这个的行家它不仅能管 Python 包还能管 Python 解释器本身的版本甚至能管 CUDA、cuDNN 这类非 Python 的二进制依赖这是 venv 和 virtualenv 做不到的。这篇内容适合三类人一是刚装完 Anaconda、还不知道下一步该干嘛的新手二是被依赖冲突折磨过、想系统搞懂 conda 环境管理的老手三是需要在同一台机器上维护多个深度学习项目、对 CUDA 版本有严格要求的开发者。我会从环境创建讲起一路覆盖换源、激活、迁移、和 PyCharm/VSCode 的对接以及那些官方文档里不会写、但实际用起来一定会踩的坑。先给一个最核心的结论base 环境只用来放 conda 本身和极少数全局工具任何项目代码都跑在独立环境里。记住这条后面 80% 的麻烦都能提前避开。2. conda 创建环境的完整命令链路与参数取舍2.1 从 conda create 说起一条命令背后的四件事最基础的创建命令长这样conda create -n myproject python3.9这条命令看着简单实际 conda 在背后做了四件事解析你指定的 Python 版本、去配置的 channel 里找匹配的包、计算所有依赖的版本组合、把解出来的包下载并链接到新环境目录。-n后面跟的是环境名myproject你可以随便起但建议用英文小写加下划线别用中文和空格否则后面激活时容易出幺蛾子。python3.9这个写法是 conda 的版本约束语法它不要求精确等于 3.9.0而是取 3.9.x 系列里最新的那个。如果你写python3.9.7那就是精确匹配。我一般建议写大版本号比如python3.9或python3.10让 conda 自己去挑补丁版本省得手动指定了一个已经下架的版本号导致解析失败。创建时还可以一次性把常用包带上conda create -n myproject python3.9 numpy pandas matplotlib jupyter这样创建完环境这些包就已经在里面了不用再单独 activate 后一个个装。对于做数据分析的场景这一条命令能省不少事。2.2 指定环境路径-p 和 -n 到底该用哪个conda 创建环境有两种定位方式一种是用-n指定名字环境会建在 conda 的 envs 目录下另一种是用-p指定绝对路径环境建在你指定的任何位置。conda create -p /data/envs/myproject python3.9什么时候用-p我遇到过的典型场景是服务器上系统盘空间紧张想把环境放到数据盘或者团队协作时大家约定把环境统一放在某个共享目录下。用-p的好处是路径明确不依赖 conda 的默认配置坏处是激活时必须写全路径比较啰嗦而且环境名在conda env list里显示的就是那串路径。我的经验是个人开发机用-n就够了省心服务器或需要迁移的场景用-p可控。两者不要混着用否则环境列表会乱得让你怀疑人生。2.3 环境创建时的 channel 优先级问题conda 默认从 defaults channel 拉包国内访问速度感人。所以创建环境前先把镜像源配好是明智之举。配置方法后面第 4 节会详细讲这里先提一句channel 的顺序决定了 conda 优先从哪找包顺序配错了可能出现明明国内源有某个版本、conda 却非要去国外源找的情况。创建环境时也可以临时指定 channelconda create -n myproject python3.9 -c conda-forge-c指定的 channel 优先级高于配置文件里的。做深度学习环境时我经常用-c conda-forge来拿一些 defaults 里没有的包。2.4 创建完先别急着装东西验证一下环境建好后第一件事是确认它真的建对了conda env list这条命令会列出所有环境当前激活的环境前面有个星号。找到你刚建的那个确认路径没问题。然后激活它conda activate myproject激活后命令行提示符前面会出现(myproject)这时候which python或where python应该指向环境目录下的 python而不是系统 Python。这一步验证很关键我见过太多人以为激活成功了结果 pip 装的包全进了 base 环境就是因为 shell 没真正切换过去。3. 激活失败与 conda init那个绕不过去的报错3.1 run conda init before conda activate 到底在说什么这个报错几乎是每个 conda 新手都会撞上的墙。完整报错长这样CommandNotFoundError: Your shell has not been properly configured to use conda activate. To initialize your shell, run $ conda init SHELL_NAME它的意思是你的 shell 还不知道conda activate这个命令该怎么解析。conda 安装时虽然把可执行文件放进了 PATH但activate本质上是一个 shell 函数需要被注入到 shell 的启动脚本里才能用。conda init干的就是这件事——它往你的.bashrc、.zshrc或 PowerShell profile 里写一段初始化代码。解决办法很直接conda init bash如果你用的是 zsh就换成conda init zsh。执行完它会告诉你修改了哪个文件然后你需要重开一个终端或者手动 source 一下那个文件source ~/.bashrc重开终端后conda activate就能正常用了。3.2 为什么重开了终端还是不行有几种情况会导致conda init之后依然失效。第一种是 shell 配置文件里本来就有语法错误conda 写入的代码段被前面的错误挡住了根本没执行到。这时候你可以手动检查.bashrc末尾看看有没有类似这样的段落# conda initialize # !! Contents within this block are managed by conda init !! __conda_setup$(/opt/anaconda3/bin/conda shell.bash hook 2 /dev/null) ... # conda initialize 如果没有说明conda init没写进去可能是权限问题。如果有但没生效检查一下这段代码是不是被return或exit之类的语句提前截断了。第二种情况是你在脚本里用conda activate。脚本执行时不会加载交互式 shell 的配置文件所以 activate 用不了。解决办法是在脚本开头显式 sourcesource /opt/anaconda3/etc/profile.d/conda.sh conda activate myproject这个conda.sh路径根据你的安装位置调整用conda info --base可以查到 base 路径。3.3 Windows 上的激活问题不太一样Windows 下如果用 CMDconda activate一般装完就能用如果用 PowerShell可能会遇到执行策略限制报 无法加载文件...因为在此系统上禁止运行脚本。这时候需要改一下执行策略Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser改完重开 PowerShell 即可。Git Bash 在 Windows 上则经常需要手动conda init bash因为 Git Bash 的配置文件路径和标准 bash 不同。提示如果你在服务器上用的是非交互式 SSH 执行命令conda activate同样会失效原因和脚本场景一样。养成在脚本里先 sourceconda.sh的习惯能省掉大量莫名其妙的报错。4. 换源这件事配对了速度翻十倍配错了全是坑4.1 为什么要换源以及换源的两种方式conda 默认的包仓库在国外国内直连下载速度经常只有几十 KB/s装个 PyTorch 能等到天荒地老。换成国内镜像源后速度通常能到几 MB/s 甚至十几 MB/s。换源有两种方式一种是改配置文件.condarc一种是命令行临时指定。.condarc文件一般在用户主目录下Windows 是C:\Users\用户名\.condarcLinux/Mac 是~/.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/cloudshow_channel_urls: true这行建议加上它会在安装包时显示包是从哪个源来的排查问题时很有用。4.2 换源后常见的三个坑第一个坑是混用多个镜像源导致依赖解析变慢甚至失败。有些人图省事把清华、中科大、阿里云的源全塞进.condarc结果 conda 要在多个源之间反复比对解析时间反而变长还可能因为不同源同步进度不一致而找不到包。我的建议是只保留一个主镜像源需要 conda-forge 时再单独加。第二个坑是镜像源同步延迟。国内镜像不是实时同步的新发布的包可能要等几小时到一天才出现。如果你要装的是刚发布的新版本国内源找不到这时候临时用官方源conda install -c defaults package_name第三个坑是换源后 base 环境里的 conda 更新出问题。有时候镜像源的 conda 版本落后更新时会报依赖冲突。这种情况我一般直接conda update -n base conda -c defaults强制从官方源更新 conda 本身。4.3 pip 也要单独换源conda 换源只管 conda 装的包pip 装的包走的是 PyPI需要单独配。在用户目录下建pip/pip.iniWindows或.pip/pip.confLinux/Mac[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn这一步很多人会漏结果 conda 装包飞快pip 装包还是龟速。两个都配上体验才完整。5. 环境迁移与复现从 environment.yml 到跨机器搬运5.1 导出环境conda env export 的正确用法项目做完了要换台机器跑或者要交给同事复现最规范的做法是导出环境文件conda env export environment.yml这个文件里记录了环境名、所有包的精确版本、channel 信息。别人拿到后一条命令就能重建conda env create -f environment.yml但这里有个大坑conda env export默认会带上prefix字段记录你本地的绝对路径。别人用这个文件创建环境时conda 会尝试往那个路径建路径不存在就报错。所以导出后一定要手动把prefix:那一行删掉。另一个坑是跨平台问题。Linux 上导出的 environment.yml 拿到 Windows 上用大概率失败因为很多包的平台相关依赖不一样。跨平台复现时建议用--no-builds参数导出去掉 build 号conda env export --no-builds environment.yml这样 conda 会根据目标平台重新解析合适的 build。5.2 只导出显式安装的包--from-historyconda env export会把所有依赖包都列出来包括那些你根本没主动装、只是被依赖带进来的。文件又长又难读而且容易因为某个间接依赖的版本问题导致重建失败。更清爽的做法是用--from-historyconda env export --from-history environment.yml这样只导出你显式conda install过的包重建时让 conda 自己去解析依赖。文件短可读性好跨平台成功率也高。缺点是复现的版本可能和你原来的不完全一致因为间接依赖会重新解析。做科研需要严格复现的场景还是用完整导出日常开发用--from-history更舒服。5.3 直接搬运环境目录快但脆还有一种野路子是直接把整个 envs 目录下的环境文件夹拷到另一台机器。这招在同操作系统、同架构、同 conda 安装路径的情况下能用速度极快不用重新下载。但只要路径变了、系统变了环境里的硬编码路径就会失效python 解释器可能直接起不来。如果非要这么干拷完后需要修复路径。conda 没有官方的路径修复命令但可以用conda-unpack需要配合 conda-pack 工具。我的建议是能用 environment.yml 就用 yml别图省事直接拷目录除非你很清楚自己在干什么。5.4 环境迁移到无网络机器内网机器没法联网下载包这时候可以用conda pack把环境打包成一个 tar.gzconda pack -n myproject -o myproject.tar.gz拷到目标机器后解压到某个目录激活时直接 source 里面的 activate 脚本即可。这个方式把整个环境连同 Python 解释器一起打包目标机器不需要装 conda 也能跑适合部署场景。6. 和 PyCharm、VSCode 对接时的环境选择6.1 PyCharm 里怎么指向 conda 环境PyCharm 新建项目时解释器选择界面有 Conda Environment 选项。选 Existing environment然后指向你的环境目录下的 python 可执行文件。Linux/Mac 下路径是~/anaconda3/envs/myproject/bin/pythonWindows 下是~\anaconda3\envs\myproject\python.exe。如果列表里没有你的环境点旁边的齿轮手动添加。有个细节PyCharm 有时会识别不到 conda 的 base 路径需要手动指定 conda 可执行文件的位置。指定一次之后它就能自动列出所有环境了。我踩过的一个坑是PyCharm 里改了环境但终端里还是旧环境。这是因为 PyCharm 的终端和项目解释器是两套配置。项目解释器决定代码运行时用哪个 Python终端决定你手敲命令时用哪个。两个都要改否则会出现代码里 import 成功、终端里 pip 装到了别处的诡异现象。6.2 VSCode 的环境切换逻辑VSCode 不像 PyCharm 那样有强绑定的项目解释器概念它是通过选择 Python 解释器来切换的。快捷键CtrlShiftPMac 是CmdShiftP输入 Python: Select Interpreter列表里会列出所有 conda 环境。选一个之后VSCode 的集成终端会自动激活对应环境代码补全和调试也都用这个解释器。VSCode 有个好处是它会在项目目录下生成.vscode/settings.json记录你选的解释器路径。团队协作时把这个文件提交到仓库大家打开项目就自动用同一个环境省去手动切换。但要注意VSCode 的 Python 扩展需要能识别 conda。如果它列不出你的环境检查一下python.condaPath设置指向 conda 可执行文件。另外VSCode 终端默认可能不自动激活 conda 环境需要在设置里把python.terminal.activateEnvironment设为 true。6.3 Jupyter Notebook 怎么用指定环境Jupyter 默认只认它自己所在的那个环境。想让某个 conda 环境出现在 Jupyter 的 kernel 列表里需要在该环境里装 ipykernel 并注册conda activate myproject conda install ipykernel python -m ipykernel install --user --name myproject --display-name Python (myproject)注册完重启 Jupyter新建 notebook 时就能在 kernel 列表里看到 Python (myproject) 了。--display-name是显示给用户看的名字可以起得友好一点。如果注册错了想删掉用jupyter kernelspec list jupyter kernelspec remove myproject7. 那些官方文档不会告诉你的实操细节7.1 环境名别用中文路径别带空格这是血泪教训。环境名用中文conda 本身可能不报错但很多第三方工具尤其是老版本的 pip、setuptools处理非 ASCII 路径时会出问题。路径带空格更麻烦shell 脚本里到处要加引号稍不注意就解析错误。环境名用英文小写加下划线路径全用英文这是最省心的组合。7.2 删除环境要删干净conda remove -n myproject --all会删除环境但有时候环境目录会残留。删完后去 envs 目录看一眼如果文件夹还在手动删掉。残留的环境目录会让conda env list显示一个已经不存在但还列在那的环境看着膈应。另外如果你用-p建的环境删除时也要用-p指定路径不能用-n。7.3 conda 和 pip 混用的正确姿势conda 环境里可以用 pip但顺序有讲究先用 conda 装能装的conda 装不了的再用 pip。原因是 conda 有自己的依赖解析器pip 没有pip 装的包 conda 不知道后续 conda 更新时可能把 pip 装的包覆盖掉或者搞出冲突。如果某个包 conda 源里没有只能 pip 装装完后建议conda list看一眼确认包确实进了当前环境。我见过 pip 装到了用户目录--user而不是环境目录的情况结果换个环境也能 import造成这个包怎么哪都有的困惑。7.4 环境多了怎么管理项目一多环境能攒到几十个。conda env list输出一屏都放不下。这时候可以定期清理把不再用的环境删掉把常用的环境在.condarc里设个默认。另外给环境起名时带上项目缩写或用途比如nlp_bert、cv_yolo比env1、test这种名字强太多过两个月你自己都记不住哪个是哪个。7.5 磁盘空间环境其实很占地方每个 conda 环境都是完整的 Python 解释器加一堆包一个环境占几百 MB 到几个 GB 很正常。装了几个 PyTorch 环境后磁盘告急是常事。清理方法conda clean --all能清掉下载缓存和没用的包通常能释放几个 GB。但注意这个命令会清掉所有环境的包缓存下次装包要重新下载所以别频繁执行。如果确实需要多个环境共享一些大包conda 有硬链接机制相同版本的包在不同环境间是硬链接的不会重复占空间。但 pip 装的包不走这套机制会实打实占多份。这也是为什么建议优先用 conda 装包的原因之一。8. 一个完整的实战流程从零到跑通 PyTorch 项目把前面所有内容串起来走一遍完整流程。假设你要做一个图像分类项目需要 PyTorch 加 CUDA 支持。第一步确认 conda 可用conda --version conda info --base第二步配好镜像源.condarc按第 4 节配置。第三步创建环境conda create -n cv_project python3.9 conda activate cv_project第四步装 PyTorch。这里要注意 CUDA 版本匹配去 PyTorch 官网查对应命令比如conda install pytorch torchvision torchaudio pytorch-cuda11.7 -c pytorch -c nvidia装完验证python -c import torch; print(torch.__version__); print(torch.cuda.is_available())输出 True 说明 CUDA 可用。第五步装项目其他依赖能 conda 装的用 conda剩下的用 pip。第六步导出环境文件conda env export --from-history environment.yml第七步在 PyCharm 或 VSCode 里指向这个环境开始写代码。这套流程我跑过不下几十次每次新项目都照这个来基本不会出问题。唯一需要灵活调整的是 PyTorch 的 CUDA 版本这个必须和你的显卡驱动匹配装之前一定先nvidia-smi看一眼驱动支持的 CUDA 版本。最后分享一个我自己的习惯每建一个新环境第一件事是conda list看一眼里面有什么确认是干净的新环境而不是继承了 base 的一堆包。这个动作花不了几秒但能避免很多这个包哪来的的困惑。环境管理这事前期多花五分钟后期省下五小时。