ARTICLE DETAIL

资讯详情

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

Anaconda conda虚拟环境实战:安装换源、环境管理与IDE配置

Anaconda conda虚拟环境实战:安装换源、环境管理与IDE配置 做Python开发这几年Anaconda一直是我电脑里的“标配工具”尤其是围绕conda虚拟环境那一套建环境、删环境、切环境的操作几乎每天都要用。很多人第一次接触Anaconda时会觉得它“又大又重”安装包动辄几百MB装完C盘直接少好几个G但只要你搞明白虚拟环境和conda常用指令这两个核心概念它反而能帮你把乱七八糟的依赖关系理得明明白白。这篇文章我会从零开始把Anaconda的安装、换源、创建虚拟环境、删除虚拟环境、环境备份迁移、PyCharm和VSCode里怎么配置这些事整体过一遍每个命令都会解释背后的原理和我的实操经验。特别适合两类人看一类是刚学Python、被各种包依赖问题折磨的新手另一类是已经在写项目但每次换电脑、换环境都要折腾半天的老手。1. 先搞清楚虚拟环境到底解决了什么问题Anaconda凭什么是最舒服那台车1.1 没有虚拟环境的时候依赖冲突是怎么逼疯人的先说你一定遇到过的场景手头有个老项目用的是Django 2.2新项目要用Django 4.2两个项目都在同一个Python环境里pip install这个装完那个就崩。再比如A项目需要numpy 1.19B项目用了新语法必须numpy 1.24一旦升级A项目直接跑不起来。这就是典型的“依赖地狱”。虚拟环境做的事情很简单就是在系统Python之外给你隔离出一批独立的小空间每个空间里有自己的一套Python解释器和site-packages目录互相之间不干扰。你用项目A的时候进到A的空间用项目B的时候切到B的空间切过去就像换了台干净机器一样。conda虚拟环境比Python自带的venv更进一步它不仅能隔离pip安装的包还能隔离不同版本的Python解释器本身。比如老项目跑在Python 3.7上新项目用Python 3.11以前要装两个Python再手动切换现在conda一条命令就能建出两个互不相干的环境每个环境里可以指定不同的Python版本。这一点在实际工作中帮了我大忙。1.2 Anaconda和conda的关系一个全家桶一个管家很多初学者容易把Anaconda和conda当成一个东西其实两者的关系用一句话就能讲明白Anaconda是一个Python发行版预装了Python解释器、几百个常用科学计算包和conda工具本身conda则是负责安装包、管理虚拟环境的程序是Anaconda里那个真正的“管家”。如果你觉得Anaconda太臃肿也可以装Miniconda它只带conda和一个Python剩下的包全部按需安装但命令和Anaconda完全一致。以我个人的使用习惯来说如果电脑硬盘不紧张就装Anaconda默认自带numpy、pandas、matplotlib这些科学计算包省去很多安装等待时间如果喜欢精简或者要在服务器上部署用Miniconda更合适。2. 从零到一Anaconda安装与conda换源2.1 安装Anaconda官网下载慢清华镜像才是首选安装Anaconda第一道坎就是下载。官网虽然提供了Windows、macOS、Linux三个平台的安装包但国内访问速度非常不稳定用浏览器直接下经常卡到怀疑人生。我一般推荐直接用清华开源镜像站的anaconda/archive目录下载版本列表很全速度也快得多。下载时注意几点Windows选64位.exe安装包macOS如果是Intel芯片选x86_64M1/M2芯片选arm64Linux选.sh文件下载后放在目录里执行bash 文件名.sh即可。安装路径尽量不要带中文和空格Windows下我习惯装在D:\Anaconda3或者保持默认的C:\Users\用户名\anaconda3避免后续一些工具解析路径出错。安装过程中会问是否把Anaconda加到PATH环境变量这一项我个人的建议是Windows下不勾选。不勾选的话以后从普通CMD启动输入conda会提示不是内部或外部命令需要打开“Anaconda Prompt”这个专用终端来操作勾选了虽然方便但有一定概率和你电脑里已有的Python产生路径冲突。对我来说装好之后手动配一下环境变量然后所有终端统一能用conda反而最省心。安装完成后验证一下版本在终端里输入conda --version能输出版本号就说明安装成功。如果提示找不到命令把Anaconda安装目录下的Scripts文件夹和condabin文件夹加到系统PATH里再重新打开终端。这一步做完Anaconda的基本安装就算搞定了。2.2 conda换源为什么装个包能慢到怀疑人生装好Anaconda之后第一件事不是急着建环境而是先换源。conda默认使用的官方源服务器在国外直接从官方源下载包经常几十KB每秒有时候直接超时报错等半天最后告诉你CondaHTTPError那种心情做过环境的人都懂。解决办法是添加国内镜像源我长期用的是清华源。在终端里依次执行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 --set show_channel_urls yes第一、二条是添加清华源的两个主要通道第三条是让后续安装包时在终端里显示包到底来自哪个源方便排错。执行完之后可以通过conda config --show channels检查当前生效的源列表正常情况下应该能看到刚添加的清华路径排在前面。如果以后想恢复默认官方源删除所有自定义频道即可conda config --remove-key channels换源之后我再跑conda install速度直接从几十KB/s提升到了几MB/s体感完全是两回事。这类操作属于配置一次、长期受益千万别跳过。2.3 conda不是内部或外部命令开机第一步踩得最多的坑我在给同事排查环境问题时听到最多的一句话就是“我明明装好了Anaconda为什么输conda提示不是内部或外部命令”。这个情况在新手期出现率极高原因主要有两个一是安装时没有把conda所在目录加到系统PATH二是安装完成后没有重新打开终端。Windows下如果确实需要手动配PATH找到Anaconda安装目录把下面三个路径加进去安装目录本身比如D:\Anaconda3安装目录下的Scripts文件夹比如D:\Anaconda3\Scripts安装目录下的condabin文件夹比如D:\Anaconda3\condabin配完之后一定要关闭当前命令行窗口再重新打开甚至注销一次Windows让环境变量彻底生效。另外补充一点新版conda还会在首次使用时提示你先运行conda init这是为了让conda命令能自动注入到你使用的shell里按照提示执行一次conda init并重启终端即可。3. 创建、激活、退出、删除虚拟环境一套完整的生命周期操作3.1 创建虚拟环境conda create的那点门道进入本文核心内容。创建虚拟环境的命令是所有conda操作里我使用频率最高的基本格式是conda create -n 环境名 python版本号-n是--name的缩写后面跟环境名称。比如我想给一个深度学习项目建一个Python 3.9的环境可以这样写conda create -n labels python3.9这里labels是环境名你可以根据项目特征随意起名后面分号之前的python3.9的意思是让conda在这个新环境里安装指定版本的Python解释器。如果你不指定Python版本conda会使用当前Anaconda默认绑定的Python版本但既然用conda搞虚拟环境建议每次都明确指定版本这样环境更可控。创建时还可以顺便把常用的包一起装好省得后面一条条补conda create -n myenv python3.9 numpy pandas matplotlib这条命令执行后conda会先解析依赖然后列出一个安装清单让你确认是否继续。你输入y回车就开始下载安装了。这个“先列出清单再确认”的机制我特别欣赏它有效避免了乱装一堆依赖的情况装完环境后用conda env list可以看到新环境已经出现在列表里。如果你不想要默认的envs目录也可以创建环境到指定路径用-p参数conda create -p /path/to/env python3.8但-p创建的环境不会自动注册到conda的环境列表里使用和删除都不方便我建议除非有特殊需要否则都用-n创建统一交给conda管理。3.2 激活、退出环境终端前面那个括号到底代表什么环境创建好之后要用它就得先“激活”。Windows、Linux、macOS三平台在新版conda里命令统一为conda activate myenv激活成功后命令行最前面会出现一个(myenv)括号标识比如(myenv) C:\Users\...这时候你的python命令、pip命令都指向这个环境里的解释器安装包也只装到这个环境里。退出当前环境也很简单conda deactivate执行后括号标识消失回到conda自带的base环境。这里有个容易踩的坑老版本conda用的是source activate myenv这种写法如果你用的是新版本直接跑source activate会报一个过时提示。新版conda官方推荐统一使用conda activate所以如果你看到run conda init before conda activate这个错误就说明conda还没有把自身初始化到当前终端先在终端执行一次conda init再重开终端就能正常激活了。激活之后想确认当前到底用的是哪个Python可以输入where pythonWindows下会输出当前Python可执行文件的路径如果路径指向你的envs\myenv目录说明激活成功如果还指向系统Python或者其他奇怪的路径就别继续往下装包了先查环境变量再说。这个排查方法在环境混淆时特别好用。3.3 删除环境删不掉才是真问题有创建就有删除管理虚拟环境久了硬盘里会堆积一堆用完一次就再也不碰的环境。删除命令是conda env remove -n myenv执行后conda会把这个环境对应的Python解释器和所有已安装包一起删掉连目录都不剩。如果环境里还有进程在占用或者你正在这个环境里删除时可能会失败所以删除前最好先conda deactivate退出目标环境。也可以用另一种写法达到同样效果conda remove -n myenv --all--all的意思是删除环境里的所有包连带环境本身一起清掉。我个人更常用conda env remove -n语义更清晰不容易跟“删单个包”的conda remove 包名搞混。删除环境后建议用conda env list确认一下列表里已经没有该环境。如果列表还在但文件夹已经空了多半是环境目录里残留了文件可以直接去envs目录下把对应文件夹删掉。Windows下路径一般是C:\Users\你的用户名\anaconda3\envsLinux则是~/anaconda3/envs。3.4 环境备份与迁移把整套环境从一个电脑搬到另一个电脑换电脑、换服务器、和同事协作这些都是避不开的环境迁移场景。最常用的迁移方式是把环境导出成一个YAML配置文件然后在另一台机器上重建。导出当前环境配置conda env export environment.yml这样当前环境下所有包的名字和版本号都会被记录下来得到一份environment.yml文件。到了新机器上只要执行conda env create -f environment.ymlconda就会按照文件里的信息把环境原样重建出来。不过conda env export默认导出的内容有一个问题它会记录每个包的具体build版本号比如numpy1.21.5py39h...这种导出文件换到不同操作系统上经常因为build号对不上导致创建失败。如果你想跨平台迁移推荐加一个参数conda env export --from-history environment.yml--from-history只记录你手动安装过的包和版本要求不会把依赖树里自动附带的包全都锁死这样导出的文件可移植性高得多。我的习惯是同平台迁移用全量导出跨平台迁移用--from-history基本不会出错。如果你需要把整个环境原封不动地打包带走包括缓存的包文件还可以用conda pack工具先安装再打包但那个方式对操作系统版本一致性要求更高日常够用的话环境配置文件的方案最稳妥。4. 高频conda常用指令与其背命令不如按用途归类记忆4.1 环境管理类指令环境管理是conda的核心能力这类指令我建议优先掌握。列出所有环境用conda env list也可以写conda info --envs两者输出基本一致会显示每个环境的名称和所在路径当前激活的环境名字旁边会带一个星号。创建环境、删除环境前面已经详细说过这里不再重复。多说一句环境复制如果你想基于现有环境复制出一个新环境不用从零创建直接执行conda create -n 新环境名 --clone 旧环境名这条命令在需要“给老项目留个快照”或者“基于现有环境改个变体”时特别好用比手动创建再装一遍包快得多。4.2 包管理类指令conda同时还是一个包管理器日常跟包打交道离不开下面这些命令conda list # 查看当前环境安装了哪些包 conda install 包名 # 安装指定包 conda install 包名1.21 # 安装指定版本的包 conda install -c conda-forge 包名 # 从conda-forge频道安装 conda update 包名 # 更新指定的包 conda update conda # 更新conda自身 conda remove 包名 # 移除指定包 conda search 包名 # 搜索可供安装的版本这里有一个很多老手都会忽略的细节pip install装进去的包不在conda list的常规显示范围里如果你想查看当前环境里所有包包括pip装的可以用pip list。我个人的习惯是能用conda install解决的优先用conda因为conda对依赖关系管理得更严格不容易出现装了包之后把其他包的依赖弄坏的情况只有conda源里确实找不到的包才退而求其次用pip install。包管理还有一个常见误区在base环境里执行conda install会把包装进base时间一长base环境变得很臃肿。我的建议是保证base环境尽量干净只放conda和基础工具日常项目包全部装到对应虚拟环境里。4.3 配置与信息类指令这类指令不常用但关键时刻能救命。查看conda整体信息用conda info它会显示conda版本、Python版本、环境根目录、源配置等一大堆信息。排查环境问题时我第一件事就是跑conda info看基础信息对不对。查看当前配置可以用conda config --show想看源配置就用conda config --show channels。清缓存用conda clean --all这条命令会清理不再需要的缓存包和临时文件C盘吃紧的时候用它释放几个G不是问题。如果conda每次启动都慢也可以试试conda clean --packages --tarballs删掉下载缓存后明显清爽。初始化shell用conda init它会在你的shell配置文件中写入必要的初始化代码让conda命令在任何新建的终端里都能直接用。这个命令在Linux/macOS上尤其重要因为很多发行版默认shell是bash不初始化的话conda activate的提示会一直缠着你。4.4 常用指令速查表为了方便平时快速查阅我把上面这些高频指令整理成一张表你可以直接复制保存功能分类命令说明创建环境conda create -n myenv python3.9新建环境并指定Python版本复制环境conda create -n newenv --clone oldenv复制已有环境查看环境conda env list列出所有虚拟环境激活环境conda activate myenv进入指定环境退出环境conda deactivate退出当前环境删除环境conda env remove -n myenv删除整个环境安装包conda install numpy在当前环境安装包查看包conda list查看当前环境包列表更新包conda update numpy更新指定包删除包conda remove numpy从当前环境移除包搜索包conda search numpy搜索可用版本导出环境conda env export --from-history environment.yml导出环境配置导入环境conda env create -f environment.yml从配置重建环境清理缓存conda clean --all清理包缓存和临时文件5. 环境建好了怎么用起来conda run和编辑器集成实战5.1 不想手动激活环境用conda run一步到位大多数教程教你跑脚本时先conda activate再执行Python这种方式在交互式终端里没问题但如果你在写shell脚本或临时执行一条命令每次都手动激活就很烦。conda提供了一个极其实用的命令conda run -n myenv python script.py这条命令直接在myenv环境里运行python script.py不需要手动激活非常适合写自动化脚本和定时任务。在CI/CD流程里这个命令几乎是标配因为它能保证你执行的Python确实是目标环境里的那个。不过要提醒一点conda run默认情况下会把环境里的stdout和stderr都绑定起来某些需要实时交互的命令比如conda run -n myenv ipython体验不太好这种交互式场景我还是建议老老实实先conda activate再用。5.2 PyCharm里配置conda环境别再为找不到解释器发愁PyCharm是我平时主力Python IDE配置conda环境其实很直观。打开项目后进入File - Settings - Project - Python Interpreter点击右上角的齿轮或“Add Interpreter”按钮选择Conda Environment再选择Existing environment。然后在解释器路径里找到你要用的环境对应的Python解释器。Windows环境下路径一般是C:\Users\你的用户名\anaconda3\envs\myenv\python.exe如果你用的Anaconda装在D盘就把前面的盘符和路径替换掉。macOS或Linux下则是~/anaconda3/envs/myenv/bin/python选择好之后PyCharm右下角会显示当前项目的Python环境运行、调试、终端都会自动使用这个环境。如果PyCharm里看不到conda环境列表先确认PyCharm的Conda executable路径是否指向了正确的conda可执行文件Windows下通常是anaconda3\Scripts\conda.exe。5.3 VSCode里配置conda环境选解释器是一个关键动作VSCode与PyCharm的配置思路不同它不叫“配置环境”而是“选择解释器”。在VSCode里安装好Python扩展后按下CtrlShiftP输入Python: Select Interpreter会列出所有检测到的Python环境包括conda的各个虚拟环境选中想要的那个即可。和PyCharm相比VSCode轻量很多启动快适合脚本开发和调试。这里澄清一个容易混淆的概念conda和VSCode不是同类工具conda负责环境与包管理VSCode负责代码编辑与调试二者是互补关系没有任何冲突。你完全可以在VSCode里开心地使用conda环境这也是我目前最常用的组合。在VSCode里使用conda环境时我建议同时把终端也切到conda环境再执行命令点击右下角解释器图标旁边的小房子按钮或者在终端里手动conda activate一下避免出现“界面里选的环境是A终端里实际用的是B”这种错位。6. 常见问题与排查技巧实录这次我踩过的坑你直接绕过去6.1 conda命令报错“conda不是内部或外部命令”这个问题前文说过本质是conda不在当前终端的PATH环境变量里。第一步先检查你装Anaconda时是否勾选了加入PATH没勾就手动添加三个路径第二步关掉所有命令行窗口重新打开第三步如果还是不行检查系统环境变量里是否有老版本的Python路径把conda挤下去了。Windows下还可以直接打开“Anaconda Prompt”试一下这个专用终端会自动加载conda环境变量能在这上面跑通说明conda本身没问题问题出在系统PATH配置。6.2 执行conda activate报错run conda init before conda activate这个报错信息我在新版conda里见到过无数次原因很明确conda需要在shell里预置一些初始化脚本才能支持conda activate指令。解决方式就是按提示执行conda init然后重开终端。Linux或macOS用户可以指定shell类型比如conda init bash、conda init zsh如果用的是其它shell也可以在init命令后面带上对应的shell名。初始化完之后conda activate就能正常用了。6.3 conda install下载速度慢或直接超时大多数情况下是源没换好。用conda config --show channels查看当前源如果只有默认官方源就去换成清华源。还有一种可能是你换源后conda安装时还会去访问默认源因为conda会按排列顺序逐个尝试如果默认源排在自定义源前面就会先卡在默认源上。解决方法是把官方源从channels列表里清理干净或者执行conda config --set channel_priority strict让conda优先使用自定义源。6.4 激活环境之后pip install还是装到别的环境里这个问题通常发生在混用pip和conda的场景。本质原因是当前终端里pip命令指向的不是conda环境里的pip。先执行where pipWindows或which pipLinux/macOS如果显示的是系统Python的pip路径说明conda activate没有正确生效或者当前shell环境被其他Python的启动脚本干扰了。可以先conda deactivate再重新conda activate myenv或者干脆在激活环境后执行python -m pip install 包名这样保证用的是当前Python对应的pip。6.5 创建太多环境把C盘挤爆了Anaconda默认把环境都放在用户目录下的anaconda3\envs里Windows用户C盘空间本来就紧张多建几个环境就满了。有两个对策一是定期用conda clean --all清理缓存二是修改conda的默认环境路径打开~/.condarc文件在里面添加envs_dirs: - D:/conda_envs这样以后conda create -n创建的新环境会放到D盘。注意如果已经存在旧环境目录保留默认路径也不影响新旧环境都能正常共存。6.6 环境删除失败提示某个包正在被使用Windows下比较常见可能是后台还有进程占用环境里的某个DLL或exe文件。优先关掉正在运行的Python进程、Jupyter Notebook、PyCharm等再执行删除命令。如果还是删不掉可以直接去envs目录手动删文件夹但前提是先在命令行里执行conda env list确认这个环境没有被注册为其他状态。手动删除之后执行conda env list确认列表里已经没有该环境名一般就彻底清干净了。根据我的使用经验conda虚拟环境这套玩法一旦上手基本离不开它。新建一个环境永远是conda create -n加一个确定的Python版本换源配好一次就不想再折腾遇到环境问题先查conda env list和where python这套排查流程非常高效。最后分享一个小习惯我会给每个环境的名字加上项目或技术栈的前缀比如proj-api-py311时间久了看到名字就能想起用途而不是一堆无意义的test2、test3。建好环境后顺手跑一次conda env export --from-history environment.yml备份到项目目录里就算某天环境崩了一条命令就能从配置里重建这种安全感很值得拥有。
返回列表