见字如面。搞 Python 开发这两年,我最常被实习生问的就是“conda 到底怎么用”。那本期就把 conda 的常见指令一次性盘清楚,包括环境管理、包管理、换源、跨平台迁移、以及一堆让你怀疑人生的报错处理。这篇文我尽量用大白话讲透,全程干货,不整虚的,争取让你看完就能上手用。
1. conda 到底是什么,为什么大家都在用
1.1 用一个生活化类比理解 conda
先给第一次接触 conda 的朋友打个底。你可以把 conda 想象成一个“楼层管理员”,它管理着一栋叫“开发环境”的大楼。这栋楼里有很多间“房间”,每个房间就是一套独立的开发环境。每个房间里可以摆不同版本的 Python 解释器、不同版本的第三方库,而且房间之间互不干扰。
过去我们用 pip 装包,其实是把所有东西都堆在一楼大厅,装多了就容易打架——比如项目 A 需要 numpy 1.19,项目 B 需要 numpy 1.24,你装完 B 再跑 A,经常直接报错。conda 解决了这个问题,它的核心能力就是把“房间”隔离好,让你想住哪间住哪间,大不了哪间搞砸了就整个扔掉重装,完全不祸害其他屋子。
conda 还有一个特殊身份:它不仅管 Python 包,连非 Python 的库(比如 C 编译好的库、CUDA 相关组件)也能管。这点在深度学习、计算机视觉这类项目里非常有用,因为很多底层依赖光靠 pip 装会非常折腾。
1.2 用 conda 做项目环境管理的核心工作流
我日常用 conda 的核心工作流就四步:
- 创建一个独立环境,指定 Python 版本;
- 激活这个环境;
- 在环境内安装各种依赖包;
- 跑项目,跑完就 deactivate 退出,或者干脆把环境删除。
这四步对应的高频命令就是conda create、conda activate、conda install、conda deactivate和conda env remove。后面我会把这几个命令拆开了讲,每个参数都会给到。
2. 安装与初始化:别在第一步就翻车
2.1 Windows 安装与“conda 不是内部或外部命令”
经常有人在群里发一张执行conda --version后显示“conda 不是内部或外部命令,也不是可运行的程序或批处理文件”的截图。这个报错有 90% 的概率是安装时没有勾选把 conda 添加到 PATH,或者安装的是 Anaconda 但没打开 Anaconda Prompt。
如果你用的是 Windows,我建议重装的时候勾选 “Add Anaconda3 to my PATH environment variable”。也有人提醒说这样会影响其他软件查找 Python,但就我个人的使用体验来看,对于单机开发机,勾上它是最省心的。如果你实在不想重装,那请手动把下面几个路径加到系统环境变量 PATH 里:
C:\Users\你的用户名\anaconda3C:\Users\你的用户名\anaconda3\ScriptsC:\Users\你的用户名\anaconda3\Library\bin
加完之后,新开一个 CMD 或 PowerShell 窗口再试。注意:一定要新开窗口,因为旧窗口不会重新加载环境变量。
2.2 Ubuntu 安装时可能踩到的坑
Linux 上的安装反而比 Windows 简单。下载好 Anaconda 或 Miniconda 的安装脚本,然后直接执行:
bash Anaconda3-2024.10-1-Linux-x86_64.sh安装过程中会有几步交互确认,这一步记得选yes。最后它会问你要不要运行conda init,这里也建议选 yes。如果你当时按错了,后期可以自己补一句:
conda init bash然后source ~/.bashrc让配置生效。
在 Ubuntu 上,很多人会遇到一个情况:明明装完 conda,重启终端之后conda还是找不到。这种情况通常是 shell 环境变量的问题,解决办法就是执行export PATH="/home/你的用户名/anaconda3/bin:$PATH",或者直接再次运行conda init。尽量不要手动去改.bashrc里的 PATH 把 conda 的 bin 目录放在最前面,以免把系统自带的 Python 环境搞乱,到时候容易连python3都指向 conda 的了。
2.3 关于“conda init”报错
很多人在安装 Miniconda 后,执行conda activate会收到这样的错误提示:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run $ conda init For more information about conda init, see https://conda.io/docs/commands/init.html这个报错的意思是:conda 虽然装好了,但你的 shell 配置文件里还没有加载 conda 的初始化逻辑。这时按它说的,直接执行conda init即可。执行完记得重启终端,然后再用conda activate就没问题了。
如果你用的 shell 是 zsh,那执行的是conda init zsh。如果用的是 fish,则是conda init fish。总之 conda 会根据当前默认 shell 自动写入对应的配置。
3. 环境管理:90% 的日常都在玩这个
3.1 创建新环境的标准语法
创建虚拟环境是 conda 使用频次最高的操作之一。很多新手喜欢去搜“conda create -n livetalking python=3.12”这是什么东西,其实这就是一条最典型的创建环境命令。
conda create -n 环境名 python=3.12这里-n是--name的简写,后面接你想要的环境名字。名字可以随便取,但建议用小写字母,别带空格,也别带中文。推荐命名规则是“项目名_用途”这种格式,比如nlp_research、cv_demo、livetalking,一眼就知道这个环境是干嘛的。
Python 版本建议在创建的时候直接指定,因为后期换 Python 版本非常麻烦。一条命令同时装几个包也是可以的:
conda create -n myenv python=3.10 numpy pandas matplotlib这一条可以直接把基础数据科学三件套装进新环境,省去后面多次 install。
还有一些人需要复现项目时,会希望环境创建在指定目录下,这时用-p参数指定路径:
conda create -p /path/to/envs/myenv python=3.9用-p创建的环境在conda env list中显示的是绝对路径,而不是名称。这种方式的优点是环境可以打进 tar.gz 备份,或者直接跟项目目录一起放着,比较适合集群和离线环境。
3.2 激活、退出、查看环境
环境创建好之后,你得先“进去”才能用:
conda activate myenv激活之后你会注意到终端提示符前面多了(myenv),这就是环境已生效的标志。有的新手看到这个括号就慌,以为出 Bug 了,其实这是尊贵的“身份标识”,说明你现在正在用 myenv 环境。
如果你用的是老版本 conda,可能提示需要先执行source activate myenv或者activate myenv,不同系统有差别。但现在新版 conda 建议统一用conda activate,前提是你已经执行过conda init。
退出环境的命令是:
conda deactivate想查看当前机器上一共创建了哪些环境:
conda env list或者:
conda info --envs这两个输出基本一样,都会显示环境名和所在路径,带星号*的就是当前激活的那个。
3.3 删除环境:搞坏了就整个扔
环境这个东西最爽的就是可以随便造,造坏了也不影响别人。删除环境的标准命令是:
conda env remove -n myenv注意这里用的是conda env remove,不是conda remove。conda remove是删包,不是删环境,conda env remove才是删整个环境。很多新手就是在这两个命令上栽了跟头,以为conda remove -n myenv能删环境,结果只把这几个字打进去之后,报错“找不到环境变量”之类的提示。其实conda remove -n myenv --all也能删环境,但最语义化的写法还是conda env remove -n myenv。
删除之前我一般会先conda env list确认名称没打错,毕竟环境里面装的东西删了就没了,虽然可以重建,但有些包是从源码编译的,重新编译要了半条命。
3.4 克隆环境与导出环境配置
有时候你搭好了一个很好用的环境,想给同事或换一台机器用,没必要重新一条条装包,直接用导出功能。
导出当前环境的全部依赖列表:
conda env export > environment.yaml这个生成的文件会包含当前环境的名称、所有 conda 包和 pip 包的精确版本号,还有安装来源,基本可以 100% 复现。
别人拿到这个文件后,用下面的命令就能倒出同样的环境:
conda env create -f environment.yaml如果只是想把环境名改掉,直接用-n指定新名字即可。
还有一种更轻量的做法,只导出 pip 格式的依赖:
pip freeze > requirements.txt两个文件对比的话,environment.yaml更适合 conda 完整环境迁移,requirements.txt更适合项目团队用纯 pip 部署。我个人推荐在做线上部署的时候两份都保留。
3.5 复制克隆现有环境
如果你只是想基于当前环境做一个备份或调试副本,可以:
conda create -n myenv_copy --clone myenv这个命令会把原来的环境原封不动复制一份,包括所有的包、版本、甚至 pip 装的包。复制过程中如果网络不好可能会报错,但本质上就是重新下载一遍,所以耗时较长,做好心理准备。
4. 包管理:装包、卸包、升级一次讲清
4.1 安装核心包与常用参数
还是在已激活的环境里,装包最直观的命令是:
conda install numpy一条命令同时装多个包也可以:
conda install numpy pandas scipy按指定版本装包,这里有非常多的新手翻车,版本格式一定要写对:
conda install numpy=1.19.5注意这里是一个等号,不是两个等号,也不是“空格 suffix 等号”。如果你不小心写成了numpy==1.19.5,conda 会认为你在传参,可能会直接报错或装错。
conda 在装包的时候会做依赖解析,所以如果你指定了一个特别老的版本,它可能会自动帮你升级或降级其他包来满足依赖关系。如果你不想让它动其他包,可以先创建一个新环境再装。
4.2 卸载包
卸载包的命令是:
conda remove numpy比如热词里有人搜“conda torch卸载”,那就是:
conda remove torch如果你想把这个环境里所有包都卸掉,直接用前面说的conda env remove -n 环境名,干净利落。
4.3 更新包与环境
更新包用:
conda update numpy想升级当前环境里的所有包:
conda update --all这个命令执行的时候要小心,因为它可能会把很多包的版本都升上去,如果项目代码是几个月前写的,升级之后未必跑得起来。
升级 conda 本身:
conda update conda升级 Anaconda:
conda update anaconda4.4 查看已安装的包
查看当前环境装了哪些包:
conda list搜索某个包的最新可用版本:
conda search numpyconda search对找版本号特别有用,比如你要查 numpy 在哪个源上有哪些版本,直接搜一下比去官网看还快。
4.5 pip 和 conda 混合管理要注意的坑
我个人的习惯是:能用 conda 装的包优先用 conda,conda 装不到的就用 pip。但这里有个大坑——在 conda 环境里用 pip 装包后,再用 conda 装另一个包,有可能会把之前 pip 装的包覆盖掉或搞冲突。
conda 装包时会做依赖解析,它不一定认得 pip 装的那些包,所以有可能用它自己认为合理的版本去升级或者替换,导致原本能跑的项目突然崩了。
我在实际项目里踩过最狠的一次是:先pip install opencv-python装好 OpenCV,后来又conda install tensorflow,结果 conda 把 OpenCV 的依赖库给改写了一部分,OpenCV 直接调用报错。后来我的原则就是,一个环境里尽量只用一个包管理器做主力,另一个只是补充。
如果你非要在 conda 环境里用 pip,建议最后再执行 pip 安装,并且在环境文件里同时保留 conda 和 pip 的记录。conda 的导出文件其实本身就支持这个,conda env export会自动把 pip 包也写进pip那个段里面。
5. 镜像源配置:换源之后安装速度起飞
5.1 为什么要换源,换哪个源
默认的 conda 源在国外,你在国内装包的速度可能只有几十 KB/s,有时候还会直接超时。换到国内镜像源之后速度能提升几十倍,真的就是天壤之别。国内常用的是中科大、清华、阿里云三个镜像源。我用得最多的是清华源,稳定性和同步速度都可以。
配置清华源的方法是在终端里执行:
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-forge 也加上:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/这里注意:--add是“添加”的意思,每执行一次就加一条,而且新加的这一条会排在前面。所以如果之前配置了乱七八糟的源,你最好先conda config --remove-key channels清理一下,再重新加。
5.2 查看和修改 channel 配置
查看当前通道配置:
conda config --show channels你可以直接打开用户目录下的.condarc文件修改,这个文件就是你 conda 的配置文件。Windows 上路径一般是C:\Users\用户名\.condarc,Linux 和 macOS 是~/.condarc。
一个干净的.condarc示例大概长这样:
channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ show_channel_urls: true ssl_verify: true如果你配了多个源但源顺序不对,它会优先从最前面的源里找包,找不到才往后找。所以把最常用的源放最前面。
5.3 安装时指定临时通道
某些包只在 conda-forge 里有,这时候你不需要永久改配置,可以在安装命令后面直接指定通道:
conda install -c conda-forge pot-c就是--channel的简写,指定从哪个通道安装。这个用法在装比较冷门的包时非常常见。
5.4 换源后遇到 SSL 或 HTTP 错误
换源之后最常见的报错是CondaHTTPError: HTTP 000 CONNECTION FAILED,原因也有很多种,但最常见的是源地址写错了,或者网络代理没配对。
另一个常见的坑是:一些公司内部网络会走代理,导致访问清华源被拦。这种情况下你需要检查自己的代理设置,或者把代理关掉再试。如果是在 conda 里配置代理,可以看.condarc中的proxy_servers配置项,但这个我不建议乱配,优先检查系统代理即可。
如果你换了国内源之后发现某个包总是下载失败,建议再用默认源试试看,毕竟镜像源偶尔也会抽风。个人亲测,清华源和阿里源一般都比较稳。
6. 常用排查技巧与高频报错解决实录
6.1 找不到 conda 可执行文件怎么办
这个在 Windows、Linux、macOS 上都可能碰到。首先确认安装目录是不是在当前用户下面,其次确认是否已经执行过conda init。在 Windows 上还要看一下环境变量里有没有 conda 的安装路径。
如果你用的是 VS Code,在 VS Code 的终端里打不出conda,但 Anaconda Prompt 里却能打出来,那大概率是 VS Code 启动时没有继承完整的环境变量。解决办法:完全关闭 VS Code,然后重新打开;或者直接在 VS Code 的终端里面执行:
conda init powershell然后重开窗口。如果你用的是 Windows 的终端是 PowerShell,其实很推荐先执行一下conda init powershell,能解决很多奇奇怪怪识别问题。
6.2 “无法将 conda 项识别为 cmdlet、函数……”怎么办
这个报错是 PowerShell 用户最常见的问题。注意报错原文是:
无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。这说明 PowerShell 没有找到 conda 命令,原因还是 PATH 或者 conda init 的问题。在 PowerShell 里执行:
conda init powershell之后重启终端就行。
如果还不行,那就检查一下 Anaconda 安装目录下有没有Scripts目录,路径是否添加到了 PATH。
6.3 conda 安装包太慢或超时怎么办
如果换源之后仍然慢,或者某个包特别大,可以试试用 pip 来安装,有些包 pip 从国内 PyPI 镜像下载反而更快。先给 pip 也换个国内源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple之后再pip install 包名就会走清华 PyPI 源了。个别依赖由 conda 和其它系统库解决不了的,这样混装其实是最省事的。
如果包非常大,比如 PyTorch 这种几个 GB 的量级,建议直接去官网用 pip 方式安装,因为 conda 的包即使换源也不一定快,有时候网络状况差还会中断重来。
6.4 conda 创建环境失败,报 ResolvePackageNotFound
创建环境时指定某些包版本找不到,最常见原因就是当前配置的 channel 里没有这个版本,或者 channel 顺序有问题。解决办法是先在conda search 包名确认版本是否存在,再把正确的版本号填进去。
如果你确定某个包只在 conda-forge 里有,那就用-c conda-forge临时指定。如果还找不到,可能你这个包的名字就不是 conda 里的,需要用 pip 来装。
6.5 不小心删了 base 环境的包怎么办
base 环境是 conda 自带的基础环境,搞坏之后会影响 conda 本身。有一次我不小心在 base 里执行了conda remove --all,直接把 conda 都删得没法用了。后来只能用安装包重新覆盖安装。
所以强烈建议:base 环境里不要装项目依赖包。给每个项目单独建环境,base 就让它保持干净,专门留给 conda 自己和基础工具链用。
6.6 环境里的 Python 版本不对,能改吗
理论上同一个环境创建时指定的 Python 版本是可以后期修改的,但我不建议你直接改。你想把 Python 3.9 改成 3.10,虽然可以执行conda install python=3.10,但 conda 会重新解析一大波依赖,极大概率导致现有包版本全乱套。真遇到这种情况,我都是直接新建一个环境重新装,反正environment.yaml导出来之后几分钟就能恢复。
7. 多平台操作与 IDE 集成经验
7.1 Windows、Linux、macOS 命令差异
conda 的命令本身在三个平台上基本一致,区别主要在于终端类型和激活环境的初始化方式。Windows 上如果用的是 CMD,很多功能是正常的;如果用的是 PowerShell 或 Git Bash,就可能有兼容小问题。Git Bash 用户有时会遇到conda activate不能正常工作,可以先在 Git Bash 里执行conda init bash并将source ~/.bashrc读入。
macOS 自带的 shell 已经换成了 zsh,安装完 conda 后需要执行conda init zsh。如果原来用的是 bash,装完后也是执行conda init bash然后再重启终端。
Linux 服务器上如果遇到 bash shell 不加载 conda 的情况,检查一下.bashrc文件中是否有conda initialize那段配置,有时服务器自动部署脚本会把它覆盖掉。
7.2 PyCharm 添加 conda 虚拟环境
PyCharm 里使用 conda 环境非常方便。在设置里找到Project: xxx -> Python Interpreter,点击齿轮,然后选择Add Interpreter -> Add Local Interpreter,在左侧选择Conda Environment,再选择Existing environment,找python.exe或python的路径。
如果你已经在终端里创建好了环境,路径一般在 conda 安装目录下的envs\你的环境名\python.exe。比如 Windows 上是C:\Users\xxx\anaconda3\envs\myenv\python.exe,Linux 上是/home/xxx/anaconda3/envs/myenv/bin/python。
还有一种做法是直接在 PyCharm 里创建新 conda 环境,PyCharm 会自动帮你指定 Python 版本,比在终端里创建还方便一些。
7.3 VS Code 无法识别 conda 环境的处理
VS Code 里识别 conda 环境靠的是 Python 扩展。当你在 VS Code 里打开项目,按下Ctrl+Shift+P,输入Python: Select Interpreter,就可以看到当前机器上所有可用的 conda 环境。选好之后右下角会显示当前解释器路径。
如果你看不到 conda 环境,检查一下 VS Code 的 Python 扩展是不是最新版,有时候旧版扩展对 conda 支持不好。还有,VS Code 里打开的终端默认可能不是你系统默认的 shell,所以你执行conda activate时失败,建议把 VS Code 的默认终端设置为 PowerShell(Windows)或 bash/zsh(Linux/macOS)。
7.4 与 CMake 等编译工具结合时的注意事项
如果项目还要用 CMake 编译,并且依赖 conda 里的 Python,那么 CMake 需要被指向 conda 环境中的 Python 可执行文件。常见做法是设置CMAKE_PREFIX_PATH或直接给 CMake 传-DPython3_EXECUTABLE参数。
比如:
conda activate myenv cmake .. -DPython3_EXECUTABLE=$(which python)这样 CMake 就明确知道用哪个 Python。不然系统里如果有多个 Python,它很容易找到系统自带的那个,编译出来的模块装到 conda 环境里可能加载失败。这类问题在 Windows 上尤其常见,因为 Windows 下多个 Python 都叫python.exe,路径很容易搞混。
8. conda 常见问题速查表
| 问题现象 | 常见原因 | 解决方案 |
|---|---|---|
| conda 不是内部或外部命令 | 未添加到 PATH | 检查环境变量,或重装并勾选 Add to PATH |
| PowerShell 无法识别 conda | 未执行 conda init | 执行conda init powershell后重启终端 |
| 找不到 conda 可执行文件 | shell 未初始化或 PATH 未生效 | 执行conda init并重启终端 |
使用conda activate提示需要conda init | shell 未配置 | 按提示执行conda init bash/zsh/fish/powershell |
| 激活环境失败 | 环境名写错或未创建 | 用conda env list查看实际环境名 |
| 创建环境失败 | 源不可用或版本号写错 | conda search确认版本,临时改用-c conda-forge |
| 安装包速度慢 | 默认源在国外 | 添加清华/中科大镜像源 |
| conda install 时 pip 安装的包被覆盖 | 混合管理冲突 | 建议一个环境以一个管理器为主,pip 包最后装 |
| 卸载了 conda 或 base 环境包导致问题 | 误操作 | 重新安装 conda 覆盖,平时保持 base 干净 |
排查问题的时候,最核心的一招就是:先看报错信息里提到的路径和环境名,再动命令。Conda 的报错提示近几年做得越来越友好,绝大部分时候它已经告诉你该执行什么命令了,比如让你 runconda init,你就老老实实跑一遍。
最后再分享一个我个人的小技巧:所有装好的环境,每个月定期导出一次环境配置,存到项目仓库的environment/目录里。这个习惯帮我在电脑崩溃和换机的时候省了太多次重搭环境的时间。即便 conda 环境管理已经很方便,有备份,心里才真的踏实。