1. 为什么你绕不开 conda 这套指令
先交代一下背景。我最早接触 Python 的时候,用的还是系统自带的 Python 和 pip,后来项目一多,依赖版本互相打架,装一个包把另一个包搞坏的事情几乎每周都遇到。直到换成 conda 管理环境,才真正把这个烂摊子收拾干净。
conda 是什么呢?简单说,它既是一个包管理器,也是一个环境管理器。pip 只能帮你装 Python 包,但 conda 连 Python 解释器本身、CUDA 驱动库、系统级的依赖库都能一起管。这意味着你可以在一台机器上同时存在 Python 3.8、3.10、3.12 等多个版本的解释器,各自互不干扰,不同项目用不同环境,彻底隔离依赖冲突。
这篇内容适合谁看?刚入门 Python 但被依赖折腾疯的新手,准备好几个项目同时开发但环境总打架的进阶用户,以及想在 Windows、Linux 或 macOS 上规范管理开发环境的任何人。下面我把平时项目里最常用的 conda 指令全部拆开,从环境管理到包管理,从换源到排错,一条一条讲清楚。
2. 环境管理:虚拟环境是 conda 的第一价值
2.1 创建环境:conda create 的参数你真的用对了吗
创建虚拟环境是最基础也最常用的操作。命令格式并不复杂:
conda create -n 环境名称 python=版本号比如创建 Python 3.12 的环境:
conda create -n myproject python=3.12这里有几个容易忽略的细节。-n是--name的缩写,后面跟环境名。很多人在这一步纠结环境名能不能用中文,我的建议是不要用,因为后续命令行操作和脚本调用时,中文环境名在 Windows 终端里很容易出现编码问题,给自己找麻烦。
如果创建环境后你需要预装一些常用包,可以一次性带上:
conda create -n myproject python=3.12 numpy pandas matplotlib刚才提到的热搜词里有个非常典型的命令:conda create -n livetalking python=3.12。这是一个做 AI 数字人项目的常见场景,这种一条命令把 Python 版本和项目名绑定在一起的做法,其实就是 conda 最高效的用法——先锁定解释器版本,再往环境里装其他依赖。
创建环境时还有两个参数值得记住。第一个是-y,表示跳过确认提示,脚本自动化时非常好用:
conda create -n myproject python=3.12 -y第二个是--clone,可以基于现有环境克隆一份一模一样的:
conda create -n myproject-backup --clone myproject我在实际操作中遇到过一个坑:克隆大环境时如果原环境里有很多大体积的包(比如 torch、cudatoolkit),克隆过程会非常慢,而且容易因为网络问题中断。这时候我会优先考虑用后面要讲的conda env export加conda env create -f的方式重建环境,速度反而更快。
2.2 激活和退出环境:Windows 与 Linux/macOS 的差别
创建完环境后,下一步是激活它:
conda activate 环境名称Windows 系统下如果提示conda 不是内部或外部命令,或者无法将 conda 项识别为 cmdlet、函数,说明 conda 没有正确加入系统 PATH,或者你在当前终端会话中还没初始化。这个问题在第五节会详细展开。
激活环境的本质是什么?它会把当前 shell 的 PATH 变量前面插入这个环境的 bin 目录(Windows 下是 Scripts 目录),这样你敲python或pip时,系统优先找到的就是这个环境里的版本。
退出环境的命令:
conda deactivate另外还有个命令要注意:source activate和source deactivate是旧版本的用法,新版本 conda 已经不太推荐。如果你在网上看到老教程这么写,建议统一换成conda activate和conda deactivate。
2.3 查看、复制与删除环境
查看当前所有环境:
conda env list也可以简写成:
conda info --envs输出会显示环境名和路径,当前激活的环境前面会带一个*号。
删除环境用:
conda env remove -n 环境名称或者conda remove -n 环境名称 --all,效果一样。删除前建议先激活别的环境,避免删掉正在使用的环境导致 shell 状态异常。
这里要补充一个容易踩的坑:删除环境时如果这个环境正在被某个 Jupyter 内核或后台进程占用,Windows 下可能会提示删除失败,因为文件被锁定了。解决方案是先把相关进程关掉再删。
3. 包管理:安装、卸载、更新的正确姿势
3.1 安装包:conda install 和 pip install 怎么选
安装包最常见的命令:
conda install 包名装指定版本:
conda install 包名=版本号比如安装特定版本的 NumPy:
conda install numpy=1.26.0这里有一个非常核心的问题:conda install和pip install到底用哪个?我的经验是这样的——优先用 conda 装,conda 源里没有的包才用 pip 装。为什么?因为 conda 在安装时会帮你解析依赖冲突,而且它装的包自带编译好的二进制文件,不需要在本机走编译流程,省事也省时间。
但是 conda 官方源里的包数量比 PyPI 少很多,尤其是一些新出的冷门库,conda 可能根本没有收录。这时候就轮到 pip 出马:
pip install 包名混用 conda 和 pip 时,有一个很重要的工作习惯:先conda install装完所有能在 conda 源里找到的包,再用 pip 补剩下的。不要装一个 conda 的再装一个 pip 的,因为 conda 在后续安装新包时重新解析依赖,可能把 pip 装的包覆盖掉,造成版本不一致。
3.2 从指定渠道安装包与镜像源配置
默认情况下,conda 从官方源(repo.anaconda.com)拉取包,在国内网络环境下经常慢到怀疑人生。解决办法是换成国内镜像源。
以清华源为例,换源的做法是修改用户目录下的.condarc文件(Windows 用户是C:\Users\用户名\.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修改完建议执行conda clean -i清除索引缓存,再conda update --all验证是否生效。
还有一个细节:如果你用 conda-forge 渠道安装包,命令是:
conda install -c conda-forge 包名这里的-c参数可以叠加,多写几次就是多个渠道:
conda install -c conda-forge -c pytorch 包名注意渠道是有优先级的,写在左边的优先级更高。如果你在安装时遇到依赖解析特别慢的情况,可以考虑只保留必要渠道,减少解析范围。
3.3 卸载、更新与查看已安装的包
卸载:
conda remove 包名批量卸载不存在的场景基本没有,但卸载时可以加上-n 环境名指定操作目标环境,否则默认操作当前激活的环境。
更新单个包:
conda update 包名更新所有包:
conda update --all查看当前环境已安装的所有包:
conda listconda list还有几个衍生用法,比如查看指定包是否已安装:
conda list 包名按正则表达式筛选包:
conda list '^torch'如果某个包是通过 pip 安装而不是 conda 安装的,在conda list输出里它的 Build 列会显示pypi_0,这能帮你快速判断当前环境里哪些依赖是 pip 打进来的。
热搜词里有一条conda torch卸载,实际上就是:
conda remove torch但这里有个很典型的坑:如果你的 PyTorch 当初是用 pip 装进 conda 环境的,那你用 conda remove 是卸载不掉它的,因为 conda 并不知道它的存在。这种情况下只能用pip uninstall torch。我自己就踩过这个坑,教训就是:安装某个框架时,尽量统一用同一个包管理器完成,后续维护才不会精神分裂。
3.4 精确版本管理:环境导出与恢复
团队协作或多台机器部署时,环境的可复制性很重要。导出当前环境的完整依赖列表:
conda env export > environment.yaml用这个文件重建一模一样的环境:
conda env create -f environment.yaml这里提示一点:完整导出的environment.yaml通常会包含一些本机特有的绝对路径(比如/home/ubuntu/anaconda3/envs/myproject),换机器恢复环境时这些路径没有意义。如果只是想在另一台机器上恢复项目依赖,我更推荐用轻量级的requirements.txt:
pip freeze > requirements.txt然后在新环境里:
pip install -r requirements.txt不过 conda 环境用 pip freeze 也有一个问题:导出的列表里会包含一些只有 conda 才有的包(比如 conda 自己),在纯 pip 环境里安装会报错。所以实际项目中我会从 pip freeze 的输出中手动筛选必要的依赖,再配合conda env export保留 conda 层面的信息,两者结合使用。
热搜词里还有一条conda 环境tar.gz创建环境,这其实是另一种备份方式——直接在 conda 的 envs 目录下把整个环境文件夹打包成 tar.gz,再拿到别的机器解压,然后用conda create -n 新环境名 --clone /路径/解压目录的形式恢复。这种方法适合内网离线迁移环境,但跨操作系统(Windows 到 Linux)基本不可行,因为很多包是编译到特定平台的。
4. 实战场景:conda 指令在项目中的完整落地
4.1 场景一:AI 项目环境搭建
拿一个常见的 AI 项目举例。需要 Python 3.10、PyTorch、CUDA 支持,还涉及 OpenCV 和一堆图像处理库。
第一步创建环境并锁定 Python 版本:
conda create -n ai-project python=3.10 -y conda activate ai-project第二步安装 PyTorch。这一步的关键是选择匹配你机器 CUDA 版本的安装命令。官方 PyTorch 网站会自动生成对应命令,比如:
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia第三步安装图像处理相关库:
conda install opencv pillow matplotlib -y第四步用 pip 补装 conda 源里没有的包:
pip install ultralytics这个流程走下来,环境基本一次成型,很少出现依赖冲突。
4.2 场景二:Ubuntu 服务器上的 conda 安装与初始化
热搜词里有ubuntu安装conda和ubuntu conda,说明不少开发者遇到了 Linux 环境的初始化问题。在 Ubuntu 上装 conda 的正确姿势是下载官方安装脚本:
wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh bash Anaconda3-2024.10-1-Linux-x86_64.sh安装过程中一路按回车和yes。安装完成后你会发现,直接打开终端敲conda命令可能提示找不到。这是因为需要先让 bash 配置生效:
source ~/.bashrc如果还是没有生效,手动执行初始化命令:
conda init bash然后重新打开终端。这里要提醒一个细节:很多人安装时选择了“是否将 conda 初始化为 shell 环境?”这个问题的答案是yes,否则 Linux 下每次使用 conda 指令前都得手动source一堆脚本,非常麻烦。
4.3 场景三:conda 与 PyCharm / VS Code 的联动
在 IDE 里使用 conda 环境时,会遇到两个热搜词提到的困惑:pycharm添加conda虚拟环境和vscode 中执行py文件在 conda下执行。
PyCharm 里的操作路径:File -> Settings -> Project -> Python Interpreter -> Add Interpreter -> Add Local Interpreter -> Conda Environment,然后选择已有环境或新建环境即可。这里有个容易犯的错:选Virtualenv Environment是创建原生 Python 虚拟环境,跟 conda 环境不是一回事;要用 conda 管理或复用 conda 环境,必须选Conda Environment。
VS Code 里相对简单,按Ctrl+Shift+P打开命令面板,输入Python: Select Interpreter,然后选择光标指向的 conda 环境即可。如果想要在终端里激活 conda 环境再运行 py 文件,直接用conda activate 环境名 && python 你的脚本.py就好。
4.4 场景四:conda 和 CMake 项目的组合
热搜词里有windows orbbec cmake conda python,这类项目一般是在 Windows 上用 CMake 构建 C++ 核心,再包装 Python 接口,然后用 conda 管理 Python 依赖。实际操作中,conda 提供了 Python 库路径和头文件路径,CMake 构建时通过设定的Python_EXECUTABLE或Python3_ROOT_DIR来定位 conda 环境。
常见的坑是:如果你在 conda 环境里安装了多个 Python 版本,CMake 在找 Python 时可能会选中系统自带的 Python 而不是 conda 环境的。解决办法是构建时明确指定:
cmake -DPython3_EXECUTABLE=$(which python) -DPython3_INCLUDE_DIR=$(python -c "import sysconfig;print(sysconfig.get_paths()['include'])") -DPython3_LIBRARY=$(python -c "import sysconfig;print(sysconfig.get_config_var('LIBDIR'))") ..简单说,先用conda activate切到目标环境,用which python确认你用的 Python 就是 conda 环境的,再传给 CMake,这样基本不会错。
5. 高频报错与排查技巧速查
5.1 “conda 不是内部或外部命令” / “conda 项无法识别”
Windows 下最常见的两个报错,本质都是同一个问题:conda 没有在 PATH 环境变量里生效。
对照排查:
- Conda 确实安装了吗?去开始菜单找找 Anaconda Prompt。
- 当前打开的是普通 CMD 或 PowerShell,而不是 Anaconda 的专用终端?此时需要先运行
conda init(或者conda init powershell),然后重新打开终端。 - 安装 conda 时是否勾选了“Add to PATH”选项?没勾选的话需要手动把
C:\ProgramData\Anaconda3和C:\ProgramData\Anaconda3\Scripts加入系统 PATH。
提示:Windows 下修改 PATH 后,要重新打开终端窗口才生效,不是刷新一下就行的。
Linux 或 macOS 下如果报同样的错,先检查~/.bashrc或~/.zshrc里是否有conda init生成的代码块。如果被其他工具覆盖了,重新执行conda init即可。
5.2 “run 'conda init' before 'conda activate'”
这个报错一般出现在 conda 4.6 以上版本。原因是 shell 没有初始化 conda 钩子函数。执行:
conda init然后关闭并重新打开终端。如果你用的是 zsh:
conda init zsh问题就解决了。
5.3 创建环境失败或下载速度极慢
创建环境失败通常有几种情况:
网络超时。换国内镜像源是第一步。以清华源为例,修改.condarc后,很多 40KB/s 的下载速度能飙升到几 MB/s。
下载中断导致缓存损坏。可以试试先清缓存:
conda clean -a然后重新创建环境。这里的-a表示 all,包括索引缓存、包缓存、日志文件等。
磁盘空间不足。这个容易忽略,conda 环境装上 conda-forge 源的大型包以后很容易超过 10GB,创建环境前注意检查磁盘剩余空间。
5.4 vs code无法识别conda / IDE 里切了环境还是用的旧包
VS Code 无法识别 conda 环境,或者明明切换了环境但运行脚本用的还是旧 Python,通常都是 Python 扩展没有正确加载 conda 环境。解决办法:先确认 VS Code 左下角显示的 Python 解释器路径是不是指向 conda 环境;然后在设置里搜索python.condaPath,把它指向 conda 可执行文件的位置;最后重启 VS Code。
如果你在 VS Code 的集成终端里敲python结果调用了系统 Python,而不是 conda 环境的,注意检查终端是否已经激活环境。VS Code 的集成终端默认不会继承你在外部终端里激活的环境,需要你手动在终端里执行conda activate 环境名或conda deactivate切换。
5.5 安装包时提示 “could not solve for environment specs”
这是 conda 的依赖求解器觉得当前渠道里没有能满足所有依赖的版本组合。常见原因之一是频道不对。解决思路:
conda install -c conda-forge 包名改用 conda-forge 渠道往往就能绕过这个问题。另一个思路是放宽版本限制,不要一上来就锁定=版本号,先conda install 包名试试,让 conda 自行解析最合适的版本。最后还可以试试升级 conda 本身:
conda update conda新版求解器(libmamba)对大型依赖图的解析速度有明显提升,也能减少部分此类报错。
6. 指令速查表:一张表看完常用命令
下面把常用指令按用途整理成表格,方便快速查阅。这张表覆盖了日常开发 90% 以上的 conda 使用场景。
| 操作 | 指令 |
|---|---|
| 查看 conda 版本 | conda --version |
| 查看所有环境 | conda env list |
| 创建环境 | conda create -n 环境名 python=3.12 |
| 克隆环境 | conda create -n 新环境名 --clone 旧环境名 |
| 激活环境 | conda activate 环境名 |
| 退出环境 | conda deactivate |
| 删除环境 | conda env remove -n 环境名 |
| 安装包 | conda install 包名 |
| 指定渠道安装 | conda install -c conda-forge 包名 |
| 安装指定版本 | conda install 包名=1.26.0 |
| 卸载包 | conda remove 包名 |
| 更新包 | conda update 包名 |
| 更新所有包 | conda update --all |
| 查看已装包 | conda list |
| 搜索可安装版本 | conda search 包名 |
| 导出环境配置 | conda env export > environment.yaml |
| 从文件创建环境 | conda env create -f environment.yaml |
| 清缓存 | conda clean -a |
| 更新 conda 本体 | conda update conda |
| 修改镜像源 | 编辑~/.condarc文件 |
从我个人的使用体验来说,conda 指令本身并不复杂,真正的难点在于理解“环境”这套抽象,以及在不同操作系统、不同 IDE、不同项目需求之间灵活切换。把上面这些指令练顺手,日常开发中 90% 的环境问题都能自己解决。
最后再分享一个小技巧:命令行里输入指令时按 Tab 键可以自动补全环境名和包名,不用手敲一长串字母,实测在国内外多数终端环境下都有效,能省不少事。