说实话在 conda 虚拟环境里配置 JupyterLab 这件事我前前后后折腾过不下五次每次都是被同一个问题反复教做人环境建好了包装好了打开 JupyterLab 新建 Notebook结果 import 自己刚装的库直接 ModuleNotFoundError。更气人的是你在终端里明明能 import 成功偏偏一进 Notebook 就“失忆”。后来我才彻底理解JupyterLab 和 conda 虚拟环境之间的关系并不是“装好了就能自动用”这么简单。JupyterLab 本身只是个交互界面真正跑代码的是内核而内核必须和你要用的 conda 环境绑定。这篇文章我想把整套流程完整盘一遍从 Miniconda 安装、换源、创建虚拟环境到安装 JupyterLab、注册内核再到那些最常见的报错比如 conda activate 报错、环境不显示、Winerror 1114 DLL 加载失败等等一次说清楚。1. 为什么非要在 conda 环境里跑 JupyterLab三种姿势我全都踩过1.1 不区分环境的安装方式最接近“假成功”很多人最开始的做法是打开终端直接pip install jupyterlab装完一切正常。但这里有个隐蔽的坑如果你当时处在 base 环境里JupyterLab 是 base 的前端界面内核默认也是 base 的 Python。等你在 conda 里创建了另一个环境并且在这个环境里 pip 安装了 pytorch、numpy 等一堆包回到 JupyterLab 新建 Notebook想 import 这些包大概率会失败。原因很简单Notebook 的代码是交给内核执行的而内核绑定的解释器是 base 的base 里面根本没有你新装的那些包。你在 conda 环境的终端里能 import是因为终端激活了那个环境解释器路径指向了那个环境的 site-packages但 JupyterLab 并不知道这件事。这种“假成功”特别容易让人误判因为每一步看起来都对环境建了、包装了、JupyterLab 也能打开。结果一到真正跑代码就露馅了。我当初为了排查这个甚至把 JupyterLab 卸载重装了好几次完全是在错误的方向上使劲。1.2 JupyterLab 认的是 kernel不是环境要彻底理解这个问题得先搞懂 kernel 的概念。JupyterLab 打开一个 Notebook实际上是在本地起了一个 kernel 进程Notebook 里的代码都发给这个 kernel 去执行执行结果再返回到界面里显示。这个 kernel 其实就是由 ipykernel 这个库提供的一个 Python 解释器实例。这里可以打一个比方JupyterLab 好比一家餐厅kernel 是厨师conda 环境是厨房。你把餐厅装修得再漂亮JupyterLab 装得再好如果厨师不是从那个厨房出来的kernel 没有注册到对应环境做出来的菜仍然不是那个厨房的手艺。所以正确的思路不是“在每个 conda 环境里都装一个 JupyterLab”而是“装一个 JupyterLab然后把每个 conda 环境的 kernel 注册进去”。注册之后JupyterLab 启动时会在 kernelspec 列表里看到所有已注册的环境你新建 Notebook 的时候就能选择到底用哪个环境的内核来执行代码。1.3 正确定位JupyterLab 负责交互conda 负责依赖搞清楚了这一点其实就明白这套组合的合理分工了conda 管依赖隔离JupyterLab 管交互展示内核注册负责把两者连接起来。我的习惯是在 base 环境里只装一个 JupyterLab 和一些必要的管理工具不往 base 里装任何项目相关的包。每个项目单独建一个 conda 环境装好项目需要的依赖然后把这个环境作为内核注册到 JupyterLab。这样项目之间互不干扰Notebook 里也能随时切换内核比每个环境都装一遍 JupyterLab 干净得多也省磁盘空间。2. 开局先补课Miniconda 安装、换源、基础命令这条线一次理清2.1 Anaconda 还是 Miniconda如果你刚入门可能看到网上教程一会儿说 Anaconda一会儿说 Miniconda容易犯迷糊。简单来说Anaconda 是一个发行版自带几百个常用包和图形界面开箱即用但体积大、装得慢、还有一堆你可能永远不会碰的包。Miniconda 则只包含 conda 本身和 Python其他的包需要自己装。我个人的建议是除非你完全不想碰命令行否则优先用 Miniconda。因为它足够干净环境从零搭建你知道自己每一步装了什么出问题也好排查。安装包去官网下载对应平台的安装器就行Windows 下是 exemacOS 下是 pkg 或 shell 脚本Linux 下是 shell 脚本。安装过程中有一个细节要注意如果是 Windows 下的 exe 安装包安装向导里有一项 “Add Miniconda3 to my PATH environment variable”默认是不勾选的。如果你不勾选装完以后在 CMD 里敲 conda 会提示“conda 不是内部或外部命令”。我对这个勾选的处理是装的时候不勾装完以后手动把C:\Users\你的用户名\miniconda3、C:\Users\你的用户名\miniconda3\Scripts、C:\Users\你的用户名\miniconda3\Library\bin这三个路径加进系统 PATH。手动加的好处是你能清楚地知道改动在哪里以后要删也删得干净。2.2 先换源再干活国内网络环境的痛不用我多说。用默认源下载 conda 包慢的时候真的能让人怀疑人生。建议安装完 Miniconda 之后第一件事就是配置清华源。在终端里依次执行下面这几条命令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 --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --set show_channel_urls yes执行完以后conda 会把配置写进用户目录下的.condarc文件。show_channel_urls yes的意思是安装包的时候把来源渠道显示出来方便你确认用的是不是镜像源。配置完可以先跑一下conda clean -i清除索引缓存再执行conda update conda测试一下速度。不过要提醒一句清华源里面的 conda-forge 目录是同步的建议尽量用 conda-forge 渠道的包。有些包只在 conda-forge 里更新得比较及时main 渠道里的版本可能偏老。2.3 几个高频命令先记住这里整理一份我每天都在用的 conda 基础命令新手可以直接收藏当笔记操作命令创建虚拟环境conda create -n 环境名 python3.10 -y激活虚拟环境conda activate 环境名退出虚拟环境conda deactivate查看所有环境conda env list删除虚拟环境conda env remove -n 环境名查看当前环境包conda list导出环境依赖conda env export environment.yml注意删除环境的时候一定要先退出该环境再删否则在 Windows 上会报文件占用错误。导出环境依赖这个操作建议在项目收尾或者要迁移到别的机器时用可以完整保留环境和包的版本信息。3. 创建虚拟环境时最容易埋雷的三个细节3.1 Python 版本别乱选创建环境的时候很多人图省事直接写conda create -n myenv不指定 Python 版本。这样创建的虚拟环境会沿用 conda 配置的默认 Python 版本而这个默认版本不一定是你后面要用的。我的建议是每次创建环境都显式指定 Python 版本比如conda create -n myenv python3.10。原因有两个第一你后面要装的一些库可能只支持某个特定版本的 Python比如老旧的 TensorFlow 1.x 只支持到 Python 3.7PyTorch 虽然在 Python 3.12 上已经能跑了但某些配套的第三方库还没适配第二显式指定版本以后环境创建的日志里会明确告诉你装的是哪个 Python避免后面排查问题时连代码跑在哪个解释器上都不知道。那到底选哪个版本比较稳妥我个人现在是组合新项目统一用 Python 3.10 或 3.11这两个版本兼容性最好几乎主流库都支持。除非项目里明确要求“只支持 Python 3.9”否则不用特意用老版本。3.2 环境名别乱取你会后悔的环境命名这个事看起来是小事但等到你机器上有了十几个环境之后就会体会到“命名不规范排查两行泪”是什么感觉。我之前建过一个环境叫test后来又建了test2、test_final、test_final_v2过了三个月再看完全分不清哪个环境是干什么的。之后我强制自己按照“项目功能”来命名比如nlp-train、web-api、qt-app这样一看到名字就知道它是干嘛的。另外环境名会直接出现在 JupyterLab 的内核选择列表里起一个好懂的名字比在 Jupyter 界面里面对一串无意义字符串要有用得多。3.3 激活不生效的隐蔽原因创建完环境下一步自然是conda activate 环境名。在 Windows 上这一步有两个高频问题。第一个是 PowerShell 里直接运行conda activate会报 “run conda init before conda activate”。这个报错的意思是 conda 还没有初始化当前 shell。解决方法是在 PowerShell 里执行conda init然后关掉终端重新打开让 conda 的初始化脚本生效。如果你用的是 PowerShell还可能需要先放开执行策略在管理员权限的 PowerShell 里运行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned否则 conda 的激活脚本可能被系统拦截。第二个问题是CMD 里激活成功了但 Python 解释器还是指向系统原来的版本。这种情况通常是因为环境变量 PATH 有冲突或者你用的那个 CMD 是在激活之前打开的。建议每次激活环境之后输入where python看一下路径确认解释器确实在 conda 环境目录下。4. 核心安装流程JupyterLab 与虚拟环境和 ipykernel 三件事的配合4.1 三步主流程好了前面铺垫了这么多现在进入正题。在 conda 虚拟环境里安装并使用 JupyterLab实际上就是三个步骤创建环境、安装 JupyterLab 和 ipykernel、注册内核。完整的操作流程如下按顺序执行就行# 1. 创建虚拟环境指定 Python 版本 conda create -n lab python3.10 -y # 2. 激活虚拟环境 conda activate lab # 3. 在虚拟环境里安装 JupyterLab 和 ipykernel pip install jupyterlab ipykernel # 如果你更喜欢用 conda 管理包也可以 # conda install -c conda-forge jupyterlab ipykernel # 4. 把当前环境注册为 JupyterLab 的内核 python -m ipykernel install --user --name lab --display-name Python (lab) # 5. 启动 JupyterLab jupyter lab第 4 步是关键。--name参数是内核的内部名称一般和 conda 环境名保持一致方便识别--display-name是你在 JupyterLab 界面下拉菜单里看到的显示名称可以随便起比如 “Python (ml-env)”只要自己看得懂就行。--user表示安装在当前用户的 kernelspec 目录下不需要管理员权限对单机使用来说完全够用。4.2 为什么推荐安装 ipykernel有些教程会让你装完 JupyterLab 以后通过 “New Launcher” 选 Python 3 直接新建 Notebook然后手动修改 kernel 的路径。这种做法不是不行但非常容易出错——一旦你改错了 JSON 配置文件里的路径整个内核就起不来。装ipykernel再执行python -m ipykernel install的好处是它会自动帮你把当前环境解释器的绝对路径写到 kernel 配置文件里省得手动配置也不容易写错。这只是多一条命令的事但能帮你省掉很多无谓的折腾。4.3 启动与验证怎么确定 Notebook 用的是虚拟环境当你执行完jupyter lab浏览器会自动打开 JupyterLab 界面。此时在 Launcher 里可以看到刚才注册的内核名字就是你设置的 display-name。点它新建一个 Notebook然后在第一个 Cell 里运行下面这段代码import sys print(sys.executable)如果输出结果是类似C:\Users\你的用户名\miniconda3\envs\lab\python.exe那就说明内核已经正确绑定到虚拟环境了。再进一步验证一下刚才环境里装的包import ipykernel print(ipykernel.__file__)能看到这个包的路径在envs\lab\下面就说明一切正常。另外再补一个实用参数conda run。如果你不想手动激活环境用conda run -n lab jupyter lab可以直接在指定环境里启动 JupyterLab。这在写自动化脚本或者远程起服务的时候非常有用可以少写一个激活步骤。5. 安装后高频报错排查五类问题一次讲清5.1 conda activate 报错“run conda init before conda activate”这个问题在 Windows 的 PowerShell 上尤其常见原因上面已经提了一句conda 的激活脚本没有初始化。完整的报错通常长这样CommandNotFoundError: Your shell has not been properly configured to use conda activate. To initialize your shell, run $ conda init shell For more information, please see the conda documentation.解决办法很简单按提示执行conda init然后关闭终端重新打开。如果你用的是 PowerShell记得配合设置执行策略Set-ExecutionPolicy -ExecutionPolicy RemoteSigned注意执行conda init之后你的 shell 配置文件比如 PowerShell 的 profile会被 conda 改写里面有# conda initialize 这样的注释块。这是正常的不是被劫持或者出 bug 了。删除 conda 的时候记得把这些内容也清掉否则卸载后终端每次启动会报找不到 conda 命令。5.2 打开 JupyterLab 后 conda 环境不显示注册完内核重启 JupyterLab结果内核列表里还是只有默认的 Python 3刚注册的环境不见了。这个也是很常见的问题。首先在终端里执行jupyter kernelspec list这条命令会列出所有已注册的内核。如果列表里能看到你刚才注册的那个lab但 JupyterLab 界面里没有大概率是浏览器或 JupyterLab 的缓存问题。刷新页面或者完全关掉浏览器标签页重新打开一次一般就能解决。如果jupyter kernelspec list里压根没有说明注册没有成功。重新执行一次注册命令注意先激活环境conda activate lab python -m ipykernel install --user --name lab --display-name Python (lab)注册成功后jupyter kernelspec list就会看到对应条目。再回到 JupyterLab 刷新页面问题就解决了。5.3 Winerror 1114DLL 初始化加载失败这个报错通常出现在你装了 PyTorch 或 TensorFlow 这类深度计算库之后打开 Notebook 执行import torch时报出类似这样的错误OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading C:\Users\xxx\.conda\envs\pytorch\lib\site-packages\torch\lib\c10.dll or one of its dependencies.这个报错的根源一般不是 torch 本身而是它依赖的底层 DLL 缺失或损坏。最常见的原因是 Windows 系统缺少 Microsoft Visual C Redistributable 运行库。解决方法是去微软官网下载最新版的 Visual C Redistributablex64 版本并安装装完重启电脑再试一次。还有一种情况是你在环境里用 conda 装了 torch然后又用 pip 覆盖安装了一遍导致 conda 管理的底层库和 pip 装的 libtorch 二进制文件冲突。这种混装问题最好把环境里现有的 torch 全部卸掉再用同一种方式重装pip uninstall torch torchvision torchaudio pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果你是 CPU 机器就用不带 CUDA 的版本。关键是让 torch 的二进制文件来源保持一致。5.4 PyCharm 配置 conda 解释器路径选不对在 PyCharm 里用 conda 环境很多人会卡在解释器路径上。打开设置找到 Project: xxx - Python Interpreter点 “Add Interpreter” - “Add Local Interpreter”然后选择 Conda Environment选 “Existing Environment”。这里需要填两个路径一个是 conda 可执行文件的路径一个是解释器的路径。conda 可执行文件路径Windows 下一般是C:\Users\你的用户名\miniconda3\Scripts\conda.exemacOS 下一般是/Users/你的用户名/miniconda3/bin/conda。解释器路径就是目标环境里的 Python 可执行文件Windows 下一般是C:\Users\你的用户名\miniconda3\envs\环境名\python.exemacOS 下是/Users/你的用户名/miniconda3/envs/环境名/bin/python。只要这两个路径填对了PyCharm 会自动列出该环境里已经安装的包。如果你发现列表里只有几个默认包说明选错了环境路径里的envs\环境名可能拼错了。5.5 conda 不是内部或外部命令这个报错一般发生在刚装完 conda 之后原因就是环境变量没配上。在 Windows 上你可以按 Win 键搜索“环境变量”打开“编辑系统环境变量”然后在“Path”里添加 conda 的三个目录miniconda3根目录、miniconda3\Scripts、miniconda3\Library\bin保存后重新打开终端。如果是在 CMD 里已经加了但还是无效试试换个新终端窗口或者执行refreshenv。有时候 UAC 权限问题也会导致环境变量不生效尽量用普通用户注册表方式添加不要用管理员权限写系统级变量。6. 日常使用技巧从 kernel 整理到环境瘦身6.1 给每个项目建独立 kernel 和目录用这套流程久了我习惯了一个管理套路每接到一个新项目先建一个 conda 环境再注册一个对应名称的 kernel然后在本地固定目录下建一个项目文件夹所有 Notebook 都放在这个文件夹里。结构大概是这样的D:\workspace\ ├── nlp-train\ │ ├── data\ │ ├── notebooks\ │ └── models\ └── web-api\ ├── app\ └── tests\每个项目文件夹都有独立的 conda 环境和管理目录。这样时间一长也不会乱因为环境和项目是一一对应的看到环境名就知道项目文件在哪儿看到项目文件就知道该用哪个环境跑。6.2 kernel 管理命令装的内核多了以后jupyter kernelspec list这个命令会越来越有用。它告诉你机器上到底注册了多少内核、路径分别在哪。如果你要删除某个不再使用的内核可以执行jupyter kernelspec remove 内核名注意这个命令删除的只是内核注册信息不会删除 conda 环境本身。如果你连 conda 环境也不要了需要先执行jupyter kernelspec remove 内核名再执行conda env remove -n 环境名两个地方都清理才算删干净。只删 conda 环境不删内核下次打开 JupyterLab 会看到内核列表里有个指向不存在路径的“僵尸内核”点它启动就报错。6.3 从 conda 到 uv别盲目跟风最近 uv 很火朋友圈和社区里天天有人安利说它比 conda 快、比 conda 简单。我也试过用 uv 来建虚拟环境说实话确实快命令也简洁确实很香。但在我接触的大多数项目里尤其是涉及 PyTorch、GPU 驱动、CUDA 这种复杂的二进制依赖场景conda 的环境管理仍然是最省心的选择——它能把 CUDA 相关的库也一并处理好而 uv 在这块的解决方案更多是依赖 pip 和系统环境。我的建议是别管网上吹什么先看你自己的项目类型。如果是纯 Python 项目、没有复杂的本机二进制依赖可以用 uv项目涉及深度学习、需要 conda 包生态帮你解决底层依赖就老老实实用 conda。这两者不是非此即彼的关系我自己也会在 conda 环境里用 uv 来加速 pip 依赖整理。最后再分享一个我折腾这么久以后养成的习惯每次安装新库之前先看一眼当前激活的环境到底是哪个执行conda env list确认一下再动手。这个习惯看起来很傻但真的能避免 90% 的“装了半天发现装错环境”的尴尬。虚拟环境这个东西本身不复杂复杂的是你永远不知道代码将来会跑在哪个解释器上等你在 JupyterLab 的 kernel 列表里看到自己所有项目的环境整整齐齐列在那儿这种掌控感是值得花这几分钟配置的。