ARTICLE DETAIL

资讯详情

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

conda完全指南:环境管理、包管理与常见报错一次讲清

conda完全指南:环境管理、包管理与常见报错一次讲清 见字如面。搞 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 python3.12”这是什么东西其实这就是一条最典型的创建环境命令。conda create -n 环境名 python3.12这里-n是--name的简写后面接你想要的环境名字。名字可以随便取但建议用小写字母别带空格也别带中文。推荐命名规则是“项目名_用途”这种格式比如nlp_research、cv_demo、livetalking一眼就知道这个环境是干嘛的。Python 版本建议在创建的时候直接指定因为后期换 Python 版本非常麻烦。一条命令同时装几个包也是可以的conda create -n myenv python3.10 numpy pandas matplotlib这一条可以直接把基础数据科学三件套装进新环境省去后面多次 install。还有一些人需要复现项目时会希望环境创建在指定目录下这时用-p参数指定路径conda create -p /path/to/envs/myenv python3.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 numpy1.19.5注意这里是一个等号不是两个等号也不是“空格 suffix 等号”。如果你不小心写成了numpy1.19.5conda 会认为你在传参可能会直接报错或装错。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升级 Anacondaconda update anaconda4.4 查看已安装的包查看当前环境装了哪些包conda list搜索某个包的最新可用版本conda search numpyconda search对找版本号特别有用比如你要查 numpy 在哪个源上有哪些版本直接搜一下比去官网看还快。4.5 pip 和 conda 混合管理要注意的坑我个人的习惯是能用 conda 装的包优先用 condaconda 装不到的就用 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\用户名\.condarcLinux 和 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 python3.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.exeLinux 上是/home/xxx/anaconda3/envs/myenv/bin/python。还有一种做法是直接在 PyCharm 里创建新 conda 环境PyCharm 会自动帮你指定 Python 版本比在终端里创建还方便一些。7.3 VS Code 无法识别 conda 环境的处理VS Code 里识别 conda 环境靠的是 Python 扩展。当你在 VS Code 里打开项目按下CtrlShiftP输入Python: Select Interpreter就可以看到当前机器上所有可用的 conda 环境。选好之后右下角会显示当前解释器路径。如果你看不到 conda 环境检查一下 VS Code 的 Python 扩展是不是最新版有时候旧版扩展对 conda 支持不好。还有VS Code 里打开的终端默认可能不是你系统默认的 shell所以你执行conda activate时失败建议把 VS Code 的默认终端设置为 PowerShellWindows或 bash/zshLinux/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 PATHPowerShell 无法识别 conda未执行 conda init执行conda init powershell后重启终端找不到 conda 可执行文件shell 未初始化或 PATH 未生效执行conda init并重启终端使用conda activate提示需要conda initshell 未配置按提示执行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 环境管理已经很方便有备份心里才真的踏实。
返回列表