ARTICLE DETAIL

资讯详情

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

Conda虚拟环境管理实战:从安装配置到定位环境绝对位置

Conda虚拟环境管理实战:从安装配置到定位环境绝对位置 说实话我第一次接触 Conda 的时候整个桌面乱到惨不忍睹。系统 Python、Anaconda 自带的 Python、PyCharm 里自己配的解释器还有不知道哪个项目偷偷装进用户目录的 Python全部混在一起。每次开新项目都要先花半小时理清这台机器上到底有几个 Python浪费的时间比写代码还多。后来彻底搞懂 Conda 的虚拟环境机制尤其是摸清虚拟环境在磁盘上的绝对位置之后整个工作流干净得像刚重装的系统。这篇文章就把我用 Conda 从安装到配置、再到虚拟环境管理的完整经验整理出来重点讲清楚虚拟环境的文件到底躺在哪里以及怎么随心所欲地控制它的位置。1. Conda 到底是干什么的不是包管理器那么简单1.1 环境混乱的根源在哪里很多新手装 Python 时的典型路径是去官网下载 Python 安装包一路 Next 装完然后 pip install 各种库。装一两个项目还好装多了就开始乱套。最典型的问题有三个。第一不同项目对同一个库的版本要求冲突比如项目 A 要 numpy 1.21项目 B 要 numpy 2.0装完一个另一个就跑不起来。第二系统级的 Python 环境被你搞坏之后连系统工具都可能受牵连因为你不知道哪些底层脚本依赖了你 pip 装过的某个库。第三当你装了多个 Python 版本命令行里的 python 到底是哪一个完全取决于环境变量 PATH 里谁的优先级高。Conda 解决的就是这个核心痛点它不只是一个包管理器更是一个环境管理器。它允许你在同一台机器上创建多个相互隔离的虚拟环境每个环境有自己独立的 Python 解释器、独立的库集合环境之间互不干扰。类比一下就像手机里的应用分身每个分身都有自己的数据删掉一个不影响另一个。1.2 Anaconda、Miniconda、Conda 三者到底什么关系这个问题几乎每篇教程都会提到但很多人看完还是一头雾水。用大白话讲Conda 本身只是一个工具负责创建环境、安装包、管理依赖。Anaconda 是一个发行版预装了大量常用的科学计算库比如 numpy、pandas、scikit-learn 等开箱即用但体积很大几个 GB。Miniconda 是一个精简版只包含 Conda 工具本身和 Python其他库你按需自己装。我的建议很直接新手图省事可以装 Anaconda但如果你已经知道自己需要什么库或者想保持系统干净装 Miniconda 就够了。后面讲的所有操作两个发行版完全通用命令没有区别。2. 安装前必须明确的三件事2.1 选 Anaconda 还是 Miniconda别盲目跟风我在给身边朋友推荐时一般这么判断如果你主要用 Python 做数据分析、科学计算、机器学习并且不想折腾依赖关系Anaconda 开箱即用的体验确实好因为常用的包都自带了。但代价是安装目录巨大启动时加载也偏慢而且预装的库里很多你根本用不到。如果你平时装什么库都是自己明确知道要什么或者你需要在多台机器上重复搭环境Miniconda 明显更合适。它体积小、安装快、可控性强装了之后需要什么库再用 conda install 装。我自己最后稳定下来的方案就是 Miniconda配合后面提到的清华源装包速度完全够用。2.2 下载地址与安装包选择Conda 的官方下载地址是 Anaconda 官网也可以选择清华的镜像站下载速度会快很多。在选择安装包时主要看操作系统Windows选择 64-Bit 的安装包Windows 版安装完成会自动配置环境变量安装过程中会询问是否把 Conda 加入 PATH建议勾选省去后续手动配置的麻烦。macOS有 Intel 芯片和 Apple Silicon 芯片两种安装包注意区分装错了会出现奇怪的兼容性问题。Linux选择对应架构的 .sh 脚本安装包安装时用 bash 命令执行。2.3 安装过程中的避坑注意点Windows 上安装时要注意最后一步在 Advanced Installation Options 页面有一个选项是 Add Anaconda3 to my PATH environment variable这一步建议勾选否则安装完在命令行里敲 conda 会提示找不到命令。还有一个选项是 Register Anaconda3 as my default Python如果机器上已经装了其他 Python 且你不想让 Conda 接管默认解释器这个可以不勾选。Linux 和 macOS 上安装 Miniconda 的标准流程是wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装脚本会问你安装到哪个目录默认是当前用户下的 miniconda3建议保持默认不要装到需要 root 权限的系统目录里否则后面装包和创建环境会遇到权限问题。安装成功后重新打开终端先运行一次安装脚本最后一步提示的conda init然后关闭终端重新开一个再执行conda --version能输出版本号说明安装成功。3. 安装后的标配操作conda init、换源与基础命令3.1 遇到 run conda init before conda activate 怎么办这个报错我见到过太多次了博客评论区几乎天天有人问。它的完整报错是CommandNotFoundError: Your shell has not been properly configured to use conda activate. To initialize your shell, run: $ conda init原因很简单Conda 安装好后你的 shell 配置文件Windows 上是 PowerShell 的配置文件Linux/macOS 上是 ~/.bashrc 或 ~/.zshrc里并没有被写入 Conda 的初始化代码。所以当你直接用conda activate激活环境时shell 不知道这个命令该怎么执行。解决办法就是照着提示运行一遍conda init运行完它会自动把初始化代码写入对应的 shell 配置文件然后一定要重新打开终端窗口或者执行source ~/.bashrcLinux/macOS让配置立即生效。Windows 上的 PowerShell 则要重启 PowerShell。顺带提醒一句如果你用的是 Windows 的 CMD 而不是 PowerShell建议切换到 PowerShell 或直接装一个 Git Bash。Conda 对 PowerShell 的支持最好CMD 下偶尔会遇到激活脚本执行不完整的问题。3.2 换源为什么必须换以及怎么换Conda 默认从官方源下载包国内访问速度非常慢一个几百 MB 的包下载半天都可能失败。换源是最立竿见影的优化手段没有之一。最常见的做法是使用清华镜像源。执行以下命令把 Conda 的官方源替换为清华源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配置完可以查看一下当前生效的 channel 配置conda config --show channels这里要注意一个细节不同版本的 Conda 配置源的写法略有不同新版本推荐用以下配置方式把 .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/free - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud.condarc 文件位于用户目录下Windows 是C:\Users\你的用户名\.condarcLinux/macOS 是~/.condarc。如果文件不存在第一次执行conda config命令时会自动创建。3.3 基础命令清单先建立起肌肉记忆不管你是新手还是老手这几个命令是 Conda 的基操建议背下来conda list # 查看当前环境所有已安装的包 conda search 包名 # 搜索某个包有哪些可用版本 conda install 包名 # 安装包到当前环境 conda remove 包名 # 从当前环境移除包 conda update conda # 更新 Conda 本体 conda update --all # 更新当前环境所有包 conda info --envs # 查看所有虚拟环境及其存放位置上面的conda info --envs和下面的conda env list效果一样输出格式略有差别前者会多显示一行 Conda 的安装目录信息。这两个命令后面会频繁用到因为查看虚拟环境的绝对位置就靠它们。4. 虚拟环境创建与管理从入门到理解绝对位置4.1 创建虚拟环境的完整操作与逻辑虚拟环境的核心思路就是每个环境一个目录这个目录里有独立的 Python 解释器和一套独立的包库装包和删包都只在这个目录内生效跟外面的世界互不影响。创建环境的标准命令是conda create -n 环境名 python3.9这条命令的意思是创建一个名为环境名的虚拟环境并在里面安装 Python 3.9。-n是--name的简写后面跟着环境名。如果需要在创建时就安装一些常用库可以一次性写进去conda create -n 数据项目 python3.9 numpy pandas matplotlib创建过程中会显示将要安装的包列表并询问你是否确认输入 y 回车即可。创建完成后激活环境的命令是conda activate 环境名激活后命令行提示符前面会出现(环境名)前缀这时你执行的 python 命令、pip 命令、所有包安装操作都发生在当前虚拟环境内部。退出当前虚拟环境回到基础环境执行conda deactivate有时候会遇到conda deactivate在 CMD 下不生效的情况在 PowerShell 里则是偶尔要执行两次。遇到这种问题别慌直接关掉终端重开然后重新 activate 就行。4.2 虚拟环境的绝对位置在哪里这是本文的核心很多教程讲到这里就停了但恰恰是虚拟环境放在哪这一点坑了无数人。早期我用 Conda 创建环境后一直找不到环境文件到底在哪个目录后来总算搞明白了。Conda 创建的虚拟环境默认存放在 Conda 安装目录下的envs文件夹里。如果你装的是 Anaconda环境位置是WindowsC:\Users\你的用户名\anaconda3\envs\环境名Linux/macOS/home/你的用户名/anaconda3/envs/环境名如果是 Miniconda把路径里的anaconda3换成miniconda3即可。查看所有虚拟环境的绝对位置最直接的方法是执行conda env list输出大致长这样# conda environments: # base * /home/ubuntu/miniconda3 数据项目 /home/ubuntu/miniconda3/envs/数据项目 labels /home/ubuntu/miniconda3/envs/labels带*号的是当前激活的环境。每一行后面的路径就是对应虚拟环境的绝对位置。conda info --envs输出结果类似只是多一个 Conda 安装目录的路径信息同时显示的是base环境的信息。4.3 为什么必须知道虚拟环境的绝对位置很多人觉得反正激活就能用管它在哪呢但实际工作中知道绝对位置有三大用处。第一PyCharm 或 VS Code 里配置解释器时要填路径。比如你创建了一个环境叫 py39在 PyCharm 里配置 Python 解释器时要选择的就是C:\ProgramData\Anaconda3\envs\py39\python.exe这个文件Windows 路径或者/home/用户名/anaconda3/envs/py39/bin/pythonLinux/macOS 路径。第二排查问题时要直接查看环境目录。比如某个环境装包装了一半失败了你可能需要直接删除环境目录里不完整的文件这时不知道路径就无从下手。第三虚拟环境可以整个复制或迁移。如果你在 A 机器上配置好了一个环境想原封不动搬到 B 机器上直接复制整个 envs 目录下的环境文件夹到另一台机器的同一位置很多情况下是可以直接用的。我先演示一个定位环境 Python 解释器绝对路径的完整过程。假设我建了一个环境名为 py39conda activate py39 which python在 Linux/macOS 上会输出类似这样的路径/home/ubuntu/miniconda3/envs/py39/bin/pythonWindows 上的命令是(Get-Command python).Path输出类似C:\Users\用户名\miniconda3\envs\py39\python.exe这个路径就是该虚拟环境的 Python 解释器的绝对位置。记住它你在任何 IDE 里指定解释器时都要用到它。5. 进阶玩法自定义环境位置、克隆与迁移5.1 修改默认的虚拟环境存放目录默认的 envs 目录在用户主目录或者 Conda 安装目录下如果磁盘空间紧张或者你希望把项目相关的环境放在项目旁边可以修改 Conda 默认的环境存放目录。修改方式是在 .condarc 配置文件中添加 envs_dirs 配置项。命令行执行conda config --add envs_dirs /新环境目录路径比如我想把环境都放在/data/conda_envs目录下执行conda config --add envs_dirs /data/conda_envs之后创建新环境时如果手动指定路径就不用改这个配置如果不指定Conda 会优先把环境创建在 envs_dirs 列表的第一个可用目录里。查看当前配置conda config --show envs_dirs5.2 创建环境时直接指定绝对路径如果你的需求只是某一个环境要放到指定的磁盘位置更灵活的方式是在创建时使用--prefix参数指定绝对路径而不是用-n指定名字。conda create --prefix /data/conda_envs/py39 python3.9这样创建的环境路径就是完全由你控制的。激活方式略有不同conda activate /data/conda_envs/py39激活后命令行前缀显示的可能是完整路径而不是环境名这可能稍显不方便。我个人的做法是默认环境放在 Conda 默认的 envs 目录下特殊的、体量大的环境比如装了完整 CUDA 工具链的机器学习环境用--prefix放到数据盘既节省系统盘空间又方便打包迁移。5.3 环境克隆快速复制一个环境有时候你调好了一个环境想基于它再开一个干净的副本折腾不想从头配一遍。可以用克隆命令conda create -n 新环境名 --clone 源环境名克隆操作的原理很简单把源环境目录下所有已安装的包记录读取出来在新环境目录里重新安装一遍。这个过程中依赖关系会被自动解析所以克隆出来的环境通常可以直接使用。如果源环境特别大比如有几十个 GB 的包克隆时间会较长属正常现象。5.4 环境导出与还原跨机器复现环境还有一种常见的需求是把环境配置导出成文件在另一台机器上重建。最常用的导出方式是conda env export -n 环境名 environment.yaml生成的 environment.yaml 文件里包含了该环境的完整包列表和版本号甚至包含平台的详情如 osx-64、linux-64 等。在另一台机器上执行conda env create -f environment.yaml就能重建一个一样的虚拟环境。这里有个纯粹基于经验的现象值得注意export 出来的 yaml 里如果包含了prefix字段这个字段记录的是原机器上环境所在路径。把它原样拿到新机器上执行时Conda 会提示或者直接忽略这个前缀但保险起见我会手动把 yaml 里的 prefix 行删掉让新环境落在新机器的默认目录里。6. 踩坑实录Conda 日常使用中的高频问题排查6.1 创建环境速度慢到怀疑人生如果你没有换源创建环境时下载 Python 解释器和基础包会非常慢。环境创建过程中其实是在下载一个最小的 Python 运行时和若干初始化包这些包如果都从官方源拉取国内网络环境下经常超时失败。解决办法就是前面说的换源换完源速度立竿见影。如果换源了还是慢检查一下 .condarc 里的 channels 是否真的生效了执行conda config --show channels看一眼输出。还有一种情况是 conda 在解析依赖关系时卡住终端长时间没有输出。有时候不是网络问题是 Conda 的依赖求解器新版是 libmamba在计算。新版 Conda 已经默认使用 libmamba 求解器速度比旧版快很多如果感觉解析很慢先检查 Conda 版本conda --version如果版本比较老建议先升级conda update conda6.2 命令行提示符变成(base)但我不想它每次自动激活新版 Conda 安装后默认会自动激活 base 环境每次打开终端都有一个(base)前缀。很多人觉得这个前缀碍事尤其是已经手动激活了其他环境后视觉上不够清爽。关闭自动激活 base 环境conda config --set auto_activate_base false重新打开终端就没有(base)前缀了。需要使用时仍然可以手动执行conda activate base来激活。6.3 安装的包在 PyCharm 里 import 不到这个问题的频率极高尤其是在 Windows 上。表现是终端里明明用 conda install 装好了某个包但在 PyCharm 里运行代码一直提示 ModuleNotFoundError。排查步骤三步走第一步确认 PyCharm 用的解释器是不是你 Conda 虚拟环境里的那个。在 PyCharm 的 Settings - Project - Python Interpreter 里查看当前解释器路径对比which python或(Get-Command python).Path的输出。不一致的话点击 Add Interpreter 手动添加 Conda 环境。第二步确认包确实装在当前环境里。执行conda list查看包是否在列表里。第三步确认包确实能 import。在激活该环境的终端里执行python -c import 包名能成功说明环境本身没毛病问题大概率出在 IDE 配置上。6.4 用 pip 装包还是 conda 装包很多人纠结到底用哪个。我的经验是能以 conda 安装的包优先用 conda 装因为 conda 能自动处理非 Python 的二进制依赖比如有些 C 扩展库需要动态链接库用 pip 装完运行时报错找不着 .dll 或 .so而 conda 会把这个依赖一并装好。如果某个包 conda 源里没有才考虑用 pip 装。但要注意在虚拟环境里直接用 pip 装即可它会装到当前激活环境下。关键是先激活环境再执行 pip install。如果没激活环境就用了 pip很可能会装到 base 环境里这是另一个很常见的混淆来源。6.5 虚拟环境被误删后的恢复如果不小心执行了conda remove -n 环境名 --all把环境删了而后悔想恢复只要你还记得它的配置有两种恢复思路。一种是从之前导出的 yaml 文件恢复conda env create -f environment.yaml另一种是如果环境目录还在磁盘上没有彻底清掉有些情况下 Conda 删除失败或没删干净可以直接定位到 envs 目录下对应文件夹然后尝试用conda create -p 该路径 --clone 一个临时环境的方式重新注册。这个操作有时候不太灵但值得一试。6.6 多个 Python 版本共存的最佳实践Conda 最爽的地方之一就是可以同时存在多个 Python 版本的虚拟环境。比如项目 A 需要 Python 3.8项目 B 需要 3.11你完全可以这样做conda create -n py38 python3.8 conda create -n py311 python3.11 conda activate py38想切换项目时deactivate 当前环境再 activate 另一个环境即可。这种玩法和直接改系统 PATH 的原始方案相比简直一个天一个地。7. 最后的实操心得把 Conda 用成本能我在实际使用中慢慢养成了几个习惯虽然看起来琐碎但长期下来省了很多心力。第一每台机器的第一个环境永远是base除非有特别原因否则尽量不要往 base 环境里乱装包。干净的 base 环境保证 Conda 自身运行稳定同时也方便日后排查问题。所有工作相关的依赖都用独立的虚拟环境承载。第二环境命名用英文小写加下划线不要用中文也不要用特殊字符。早期我建过一个名为统计模型的环境Windows 下后期很多工具对这个路径的处理都有 bug最后无奈重建了。第三养成随手导出环境配置的习惯。每个项目环境稳定后我通常会在项目根目录放一份 environment.yaml这样换机器或者环境崩了都能快速还原。第四也是最后想强调的不要太依赖 Conda 去管 GPU 相关的东西尤其是 CUDA 工具链。过去我尝试用 conda install 直接装 cuda-toolkit 和 cudnn经常遇到版本匹配不上、安装包下载缓慢的问题。如今更稳妥的路线是系统层面装好驱动和 CUDAConda 环境里装对齐 CUDA 版本的 PyTorch 或 TensorFlow 框架。这样既利用了 Conda 的环境隔离优势又避免了二进制兼容性问题。Conda 的入门成本其实很低核心就是理解环境隔离这四个字。搞懂了环境文件在磁盘上的存放位置掌握 create、activate、deactivate、env list 这几个命令再配合换源和 conda init日常使用基本就不会再出什么幺蛾子。网上那些报错绝大多数都一样没初始化、没换源、解释器路径填错。希望你看完这篇文章后能少走点我当年绕过的弯路。
返回列表