资讯动态

Jupyter多内核切换实战:用conda管理环境并解决PermissionError

发布时间:2026/10/9 6:21:29 来源:尧图企业网站定制
用 Jupyter 的人十个里有七八个都经历过这种尴尬明明用 conda 老老实实建了好几个环境打开 Jupyter Notebook 一看翻来覆去还是 base 里那个老内核。换个环境写的代码一到 Notebook 里就 import 报错环境切换变成了一场体力活。更糟的是好不容易跑通了某天又冒出来一个 jupyter permissionerror:[errno 13] permission denied整个人直接懵住。这篇文章就是把这些事彻底捋清楚如何配置 Anaconda 多环境把每个 conda 环境注册成 Jupyter 的独立内核然后在 Notebook 里像换台一样切换环境。我会从 Anaconda 安装开始讲一步步到环境创建、内核注册、权限报错排查最后补上默认保存路径和团队协作同步这些进阶操作。不管你是刚接触 Python 的新手还是已经被环境问题折磨过几轮的老手按这套流程走一遍就能在 Jupyter 里自由切换所有环境不用再为跑一段代码反复折腾。1. 项目概述为什么 Jupyter 需要多环境切换1.1 环境混乱几乎是所有 Python 用户的必修课我见过太多人把 Anaconda 装完之后所有包都往 base 里塞。今天 conda install 一个明天 pip install 一个也不管依赖冲突最后 base 里装了几百个包每次 conda update 都心惊胆战生怕哪个库被升级搞挂。这种问题在 Jupyter 里会被放大因为你一旦在 base 里把环境搞坏了整个 Notebook 里的代码全部遭殃项目直接瘫掉。真实的项目需求往往是分散的。日常数据分析需要 Python 3.10 配 pandas 和 matplotlib机器学习项目需要 Python 3.9 配 scikit-learn 和 TensorFlow 2.x深度学习研究可能需要 Python 3.8 配 PyTorch 1.13偶尔还要写点接口、做自动化又要 Python 3.11。这几个技术栈放在同一个环境里光依赖冲突就够喝一壶了。可如果建了多个 conda 环境却没有把它们注册成 Jupyter 内核那喜欢用 Notebook 写代码的数据分析师和研究型开发者就完全享受不到环境隔离的好处。所以多环境加多内核不是锦上添花而是 Python 工程实践里的基本盘。把环境和内核的关系理顺等于给自己的工作流装了一个可靠的调度系统。1.2 Jupyter 内核与 conda 环境到底什么关系先纠正一个经常被混淆的概念conda 环境和 Jupyter 内核不是一回事。conda 环境是一套完整的 Python 运行环境包含独立的 Python 解释器、pip、以及各种第三方库环境之间完全隔离。Jupyter kernel 则是 Jupyter 前端用来执行代码的“后端进程”你每打开一个 Notebook背后其实就连到了一个 kernel这个 kernel 决定代码最终由哪个 Python 解释器、哪组依赖包来执行。我习惯用一个生活化的类比。每个 conda 环境就像一间独立的工作室里面有专属工具箱Python 版本、库版本各不一样。Jupyter 是前台接待处你在浏览器里写的代码最终要交给后台某间工作室去执行。默认情况下前台只知道 base 这一间工作室其他工作室虽然已经建好了但没有“登记”到前台所以你在 Jupyter 的新建菜单里看不到它们也切不过去。注册内核本质就是给每个环境做一次“前台登记”。登记之后Jupyter 就知道该调用哪个环境里的 Python 解释器了。很多人问我“为什么 conda 环境里明明有这个包Jupyter 里却 import 不到”答案基本都指向这里当前 Notebook 连着的 kernel 根本不是那个 conda 环境或者那个环境压根就没注册成内核。理解了这层关系后面对付内核切换和权限报错就有底气了。2. 环境准备Anaconda 与 Jupyter 的安装配置2.1 Anaconda 安装避坑指南如果你还没装 Anaconda先想清楚两件事。第一装全量版 Anaconda 还是 Miniconda全量版开箱即用自带一百多个常用科学计算包适合不想折腾的用户Miniconda 只有 conda 和 Python其他包按需安装适合喜欢掌控环境的人。我个人偏向 Miniconda因为 base 环境天然干净和多环境多内核的思路特别搭需要什么装什么不产生一堆用不到的包。第二安装路径千万别乱选。Windows 下不要装在系统目录下比如 C:\Program Files 这种地方更不要装在带中文、带空格的路径里。我遇到过用户把 Anaconda 装到“E:\软件\Anaconda3”结果 conda 命令和环境激活各种报错最后只能卸载重装。路径里的中文和空格是很多诡异问题的根源之一其中就包括注册内核时权限不足、找不到执行路径这一类的报错。安装完成之后Windows 用户强烈建议用 Anaconda Prompt 或者 Miniconda Prompt 操作因为普通 cmd 有可能没把 conda 写进 PATH。如果在 cmd 里输入 conda 提示“不是内部或外部命令”不用急着重装先检查系统环境变量把 Anaconda3 的 Scripts 目录加进 PATH 就行。macOS 和 Linux 用户在安装结束后记得执行 source ~/.bashrc 或 source ~/.zshrc让 conda 初始化生效。装完验证一下版本conda --version能正常输出就没问题。2.2 安装并启动 Jupyter Notebook新版 Anaconda 和 Miniconda 的基础环境都不一定自带 Jupyter尤其是 Miniconda基本需要手动装。命令不复杂conda install -c conda-forge jupyter notebook这里我同时装了 jupyter 和 notebook 两个包。jupyter 是主程序notebook 是经典的笔记本界面。如果你喜欢 JupyterLab就再加一个 jupyterlab它在多标签、文件管理的体验上已经比传统 notebook 好很多了。我平时的习惯是 notebook 和 lab 都装上根据场景选。启动的方式是在激活对应环境后执行jupyter notebook或者jupyter lab启动后终端会打印一段日志一般会自动打开浏览器。如果浏览器没自动弹出来就把日志里 http://localhost:8888 那串地址复制到浏览器手动访问。这里有个人人都遇到过的细节在某个目录打开终端执行 jupyter notebook浏览器里看到的文件列表就是那个目录的内容。因为 Jupyter 默认把启动时的当前目录当成根目录新建 Notebook、浏览文件都从这里展开。这个行为后面我会讲怎么改先把环境搭起来。3. 核心操作创建多环境并注册为 Jupyter 内核3.1 用 conda 创建多个 Python 环境假设现在要建三个环境一个叫 py310用于日常数据分析Python 用 3.10一个叫 torch 项目用于深度学习Python 用 3.8一个叫 tf 项目Python 用 3.9。三条命令跑一遍conda create -n py310 python3.10 -y conda create -n torch python3.8 -y conda create -n tf python3.9 -y这里的 -n 是 name 的缩写后面跟环境名python3.10 指定初始 Python 版本-y 表示遇到确认提示直接同意。很多新手在环境命名上不讲究取的什么“深度学习环境”“数据分析”这种带中文带空格的名字后面在命令行里要加引号不说在 Jupyter 内核注册时还容易出些莫名其妙的问题。我建议统一用英文小写加下划线一眼能看出用途比如 py310、torch113、tf24。创建好之后有几个命令会经常用conda env list # 查看所有环境 conda activate py310 # 激活某个环境 conda env remove -n 旧环境名 # 删除无用环境 conda create -n 新环境 --clone 旧环境 # 克隆现有环境每个环境创建后按需安装自己项目的包。比如激活 py310 之后执行conda activate py310 pip install pandas matplotlib numpy这里想多说一句基础环境创建好之后先别急着装一堆包。确认环境能激活、pip 能正常工作再逐渐加依赖这样后面注册内核和排查问题时干扰因素会少很多。3.2 每个环境安装 ipykernel 并注册内核这是整篇文章的核心环节也是最干的部分。要让一个 conda 环境出现在 Jupyter 里必须在环境内部安装 ipykernel然后执行一次注册命令。拿 py310 举例conda activate py310 conda install ipykernel -y python -m ipykernel install --user --name py310 --display-name Python 3.10 (py310)重点解释一下这条注册命令的三个参数很多人不懂含义就乱抄出问题也不知道怎么改。--user 表示把内核注册到当前用户目录而不是系统级目录。这一步极其关键不加 --user 时ipykernel 会尝试写入系统级目录在 Windows 上经常因为权限不足直接报 PermissionErrorLinux 和 macOS 上则可能要求 sudo。个人电脑上我强烈建议一律加 --user安全又省事。--name 是内核的唯一标识内部用的小写标识符最好只用字母、数字、下划线。这个 name 会作为内核配置目录的文件夹名所以别用空格和特殊符号。--display-name 是显示在 Jupyter 界面菜单里的名字可以随意包含空格和中文都没问题完全按你的习惯来。三个环境都注册一遍之后用命令检查注册结果jupyter kernelspec list输出里会列出所有可用内核base 环境通常显示为 python3我们自己注册的 py310、torch、tf 都会列在这里。到这一步再打开 Jupyter Notebook新建文件时就能在选项里看到“Python 3.10 (py310)”这样的名字了。还有一个必须强调的操作细节注册内核命令一定要在目标环境的激活状态下执行。只装了个 ipykernel 不激活环境就注册注册出来的内核指向的还是 base 的 Python等于白干。想确认当前到底在哪个解释器环境可以执行import sys print(sys.executable)打印出来的路径如果是目标环境的 Python那说明环境激活正确接下来注册才能生效。如果环境属于内网机器无法直接 conda install ipykernel也可以先激活环境再用 pip 安装conda activate 环境名 pip install ipykernel然后再执行注册命令。逻辑完全一样。3.3 内核命名、改名与 kernelspec 管理内核注册之后系统会在特定目录生成一组配置文件这个目录体系统称 kernelspec。Windows 下路径一般在 C:\Users\你的用户名\AppData\Roaming\jupyter\kernels\Linux 和 macOS 下一般在 ~/.local/share/jupyter/kernels/。每个内核是一个子目录里面有一个 kernel.json记录了启动这个内核要执行的命令、运行环境等关键信息。如果某天想改内核的显示名比如想把“Python 3.10 (py310)”改成“数据分析用Python3.10”不用大动干戈直接编辑 kernel.json 里的 display_name 字段或者重新跑一遍 ipykernel install 命令用新的 --display-name 覆盖即可。但如果想改内核的内部 name也就是那个目录名我更推荐先删除再重新注册的流程避免手改路径导致启动报错jupyter kernelspec remove py310删掉之后再按 3.2 节注册一次换一个新的 --name。为什么不直接改目录名因为 kernel.json 里通常记录了环境路径改目录名时漏改任何一处都可能让内核启动失败到时候排查起来反而更费时间。我自己维护内核清单的习惯是每季度清理一次用 jupyter kernelspec list 看一眼把已经废弃的项目环境对应的内核删掉。内核注册得越多启动 Jupyter 时扫描的负担也越重保持精简对整个环境的响应速度有好处。4. 实战问题内核切换与 PermissionError 排查实录4.1 Notebook 中切换内核的正确姿势环境注册好了切换内核的入口主要有三个。新建 Notebook 时传统 notebook 界面通过 New 下拉菜单选内核JupyterLab 则是在启动界面点对应的图标。已经打开的 Notebook通过菜单里的 Kernel - Change Kernel 切换。切换之后当前 Notebook 的所有单元格在后续执行时都会使用新内核。这里有个容易踩的坑切换内核并不会自动重启 Notebook 的变量状态。如果你在旧内核里已经定义了一堆变量切换内核之后再执行单元格新内核可没有这些变量必须重新运行前面的代码。所以我的习惯是切换内核之前先把重要结果保存一下切换后直接 Kernel - Restart Run All让代码从干净的全局环境重新跑一遍避免出现变量残留导致的诡异结果。再分享一个能帮你快速定位“当前 Notebook 到底连的是哪个环境”的命令遇到 import 报错时特别好用import sys print(sys.executable)打印出来的路径会明确指出当前 Python 解释器在哪。如果发现路径不是目标环境的那就说明内核还连着别的环境切一下内核或者重新注册问题基本就能定位。还有一点想提醒内核切换不影响 Notebook 文件的保存位置文档存在哪就一直存在哪。但不同内核的 Python 版本可能不一样同一个 Notebook 里的代码可能在 Python 3.8 能跑切到 3.10 就报了 API 变化相关的错误。所以我的建议是按项目固定使用某个内核别在同一个 Notebook 里频繁切换不同 Python 大版本的环境省得被版本差异折腾。4.2 PermissionError [Errno 13] 的常见成因与解法来聊聊热词里出现频率很高的 jupyter permissionerror:[errno 13] permission denied。我排查过的权限报错基本可以归成三类每一类的成因和解法不太一样。第一类是注册内核时遇到的权限报错。报错信息通常长这样Could not install kernelspec ... PermissionError: [Errno 13] Permission denied: /usr/local/share/jupyter/kernels原因非常明确注册时没加 --useripykernel 默认尝试往系统级目录写但当前用户没权限。解决办法就是重新注册记得加上 --userpython -m ipykernel install --user --name 环境名 --display-name 显示名如果确实需要系统级内核那再考虑 sudoLinux、macOS或者管理员终端Windows但个人电脑完全没必要加 --user 就够了。第二类是打开 Notebook、运行代码时出现的 permission denied。这种情况通常是指向目录权限问题。最常见的是把 Notebook 文件放在当前用户没有写权限的目录里比如 C:\Users\Public、/root 目录或者共享盘的只读目录。Jupyter 在自动保存时会在同名目录下创建 .ipynb_checkpoints 子目录写不进去就会报权限错误。解决思路是换一个当前用户有完整读写权限的工作目录或者用 5.1 节的方法设置默认保存路径把工作区固定到可写的地方。第三类是 Windows 上比较隐蔽的情况曾经用管理员身份运行过一次 Jupyter导致某些文件或目录的属主变成了管理员组之后再以普通身份打开 Jupyter就发现读取不到、保存失败。这种问题的排查思路是先看清楚报错指向的文件路径右键看属性里的安全权限把当前用户加入完全控制如果那个文件本身不重要直接删掉让 Jupyter 重新生成反而更利索。排查权限问题的通用步骤我也总结一下。先看完整报错找到具体是哪个文件、哪个目录没有权限再判断是内核注册目录、Notebook 文件目录还是检查点目录然后针对不同目录处理权限或者就像前面说的直接加 --user、换工作目录别在一个权限问题上钻牛角尖。4.3 高频问题速查表整理一个排查表覆盖我最常被问到的几类情况问题现象常见原因推荐解法Jupyter 里看不到新建的环境环境内没装 ipykernel或没执行注册命令激活该环境后执行 python -m ipykernel install --user --name 环境名 --display-name 显示名运行单元格时 ModuleNotFoundError当前内核不是包所在的环境Kernel - Change Kernel 切换或用 sys.executable 确认解释器路径注册内核时报 PermissionError注册命令没加 --user重新执行并加上 --user打开或保存 Notebook 时 permission deniedNotebook 所在目录无写权限换可写目录或用 --notebook-dir 指定工作目录内核启动失败报找不到解释器kernel.json 路径被改坏用 jupyter kernelspec remove 删除再重新注册conda 环境装完新包后 Jupyter 里 import 不到内核进程还保留着旧的包加载状态Kernel - Restart必要时 Restart Run All注册的内核指向错误的 Python 环境注册时没激活目标环境激活目标环境后重新注册并用 sys.executable 验证这张表覆盖不了所有奇怪情况但面对报错时先看错误信息指向什么文件、什么目录再对着表查通常几分钟就能定位到问题。5. 进阶配置默认保存路径、内核维护与团队协作5.1 修改 Jupyter 默认保存路径很多人问过 jupyter notebook 默认保存路径怎么改。默认情况下Jupyter 的文件根目录就是你启动命令时所在的那个目录这导致不同终端启动会得到不同的目录文件散落各处。更稳的做法是写配置文件固定工作目录。先生成配置jupyter notebook --generate-config生成的文件一般在 ~/.jupyter/jupyter_notebook_config.py。用文本编辑器打开找到这一行# c.NotebookApp.notebook_dir 把注释去掉填上你想要的路径比如c.NotebookApp.notebook_dir D:/notebooks改完保存重启 Jupyter 生效。这个配置是用户级别的针对当前操作系统的用户名下的所有 Jupyter 实例。我在写教程、做分享之前都会改这个因为总不能让人看到 home 目录下一堆乱七八糟的文件。除了写配置启动时也可以临时指定目录jupyter notebook --notebook-dirD:/notebooks写配置的好处是固定工作区不用每次记命令行参数。如果是团队共用一台服务器的场景建议每个人用不同的端口启动 Jupyter配合不同的 notebook_dir避免互相看到对方的文件也避免配置互相干扰。5.2 内核清理与 conda 环境瘦身随着项目越做越多环境会膨胀到让你意外的程度。我见过一年下来十几二十个 conda 环境、Jupyter 内核列表翻好几页的机器启动 Jupyter 都慢吞吞的。定期清理是正经事。内核清理命令jupyter kernelspec list # 查看现有内核 jupyter kernelspec remove 内核名 # 删除不用的内核conda 环境清理方面常用的几条conda clean --all # 清理 conda 缓存和下载的安装包 conda env list # 检查是否有废弃环境 conda env remove -n 旧环境名 # 删除废弃环境另外建议 pip 安装依赖时多用 requirements.txt或者用 pip freeze 导出清单。这样删掉环境、重建环境时不用回忆装过哪些包成本会低很多。别指望 conda env remove 之后再手动装二十个包还能记住版本写成文件一劳永逸。再分享一个个人习惯base 环境永远是“最小化”状态只放 conda、pip、ipykernel 这类基础设施不往里装项目依赖。这样做的好处是不管哪个项目环境出了问题base 还能在“干净的基地”里做修复操作比如重装 pip、启动 conda、注册新的内核。5.3 团队协作中用 environment.yml 同步环境如果是小组一起做项目每个成员都手动 conda create 环境、手动 pip install最后大家的环境版本大概率会分叉。更稳的做法是导出一份 environment.yml全体成员基于这份文件创建一致的环境。导出当前环境的依赖清单conda activate 项目环境 conda env export environment.yml拿到文件的人执行conda env create -f environment.yml环境名写在 yml 文件里所以大家创建出来的环境名都是同一个注册内核时再用同一套命名规范团队内部就不会出现“都在跑同一个项目环境名却五花八门”的情况。这份 yml 文件建议放项目根目录纳入版本控制。更新依赖的流程是有人新增了包确认跑通后重新导出一份 yml 提交。其他人拉取代码后执行 conda env update -f environment.yml 就能同步。最后提醒一个坑conda env export 导出的文件里会带上每个包的 build 哈希换机器或者跨平台时有可能因为哈希值不匹配导致创建失败。遇到这种情况可以改用 conda env export --from-history导出的只是你手动指定过的包不带哈希跨平台兼容性更好团队协作时往往比一堆哈希报错省心得多。我在实际使用中还有一个体会多环境多内核这套方案最怕的不是环境多而是命名乱。曾经有个同事把环境名取成 a、b、c半年之后没人知道哪个环境对应哪个项目最后全部推倒重来。从第一天开始就用“项目名Python版本”这样的规则来命名环境和内核看起来是个小习惯长期下来能省掉大量沟通和排查成本。希望这篇从安装、注册、排查到进阶配置的完整流程能帮你把 Jupyter 和 conda 的关系理顺下次再遇到“Notebook 里找不到环境”或者权限报错至少不用再对着屏幕发愁了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑