Jupyter Notebook环境配置 | 如何在Jupyter中使用conda创建的虚拟环境 | 为什么同一个虚拟环境在jupyter的kernel列表中会显示两个 | kernel存储与管理
Jupyter Notebook环境配置 | 如何在Jupyter中使用conda创建的虚拟环境 | 为什么同一个虚拟环境在jupyter的kernel列表中会显示两个 | kernel存储与管理
1.在jupyter notebook中如何切换和使用conda创建的虚拟环境
一共有三种方法:
- 方法一:为每一个虚拟环境安装一个jupyter,这个太不优雅了,不再说明;
- 方法二:为每个虚拟环境独立注册一个内核;
- 方法三:自动检测内核。
推荐使用方法二,原因后面会说明。
方法二:为每个虚拟环境独立注册一个内核
创建虚拟环境之后,如果希望能够在jupyter中使用这个环境,就在激活它的情况下,安装ipykernel:
conda install ipykernel
然后将环境注册为jupyter内核:
python -m ipykernel install --user --name my_env --display-name "My Env"
参数说明:
- my_env:内核名称,建议与环境名一致
- “My Env”:Jupyter中显示的名称,可以自定义
此命令会在jupyter的kernels目录生成配置文件,指向虚拟环境的python解释器。
检验内核是否添加成功:
- 执行
jupyter kernelspec list命令,查看输出中是否包含刚刚注册的新kernel - 启动jupyter notebook,看看内核列表中有没有刚才注册的新kernel
另外,关于base环境的kernel有一点需要说明:base环境的kernel不需要我们手动注册。在base环境安装jupyter时,安装列表中包含ipykernel,并且会在安装过程中自动将base环境注册为一个kernel。这个注册过程由conda安装jupyter包时自动完成,因此不需要我们手动执行。
方法三:自动检测内核
在base环境下安装nb_conda_kernels:
conda install nb_conda_kernels
它会自动检测所有已经安装的conda环境,并将符合条件的虚拟环境显示为可用的kernel。虚拟环境需要满足的条件是:必须安装了ipykernel,并且不是隐藏环境(即名称不能以.开头)。
也就是说,不管使用哪个方法,虚拟环境都必须安装ipykernel。
2. 多个kernel显示不一致怎么回事?为什么同一个虚拟环境在jupyter的kernel列表中显示为两个内核?
在cmd或者powershell中运行jupyter kernelspec list命令时,会显示所有的kernel及其保存目录;在jupyter页面上也有kernel列表。有时这些kernel显示对应不上,这是为什么?这通常与kernel的注册方式和jupyter的检测机制有关。
不管在哪个环境,运行jupyter kernelspec list时,都会列出所有已经注册的jupyter内核。但只列出经过手动注册的内核,也就是说,通过nb_conda_kernels自动检测的、未经标准方式注册的内核并不会被列出。这是因为nb_conda_kernels会在jupyter启动时动态创建临时内核,这些内核并不会保存到磁盘上,仅在内存中存在,而jupyter kernelspec list命令只查找物理KernelSpec文件。
而在jupyter页面的内核列表中,不仅会显示出经过手动注册的内核,还会显示出通过nb_conda_kernels自动检测的动态内核。因此可能会出现同一个虚拟环境却显示了两个内核的情况。
如果你安装了nb_conda_kernels,在启动jupyter notebook时,会显示它生成的动态内核数量。但是在两种方法混用的情况下,如果你随意移动手动注册的kernel,可能导致nb_conda_kernels自动检测出现混乱。
所以不推荐两种方法混用,会造成重复和混乱。如果你已经在面对这种情况了,可以先确认一下原因是否是这个。也可以用命令查看是否安装了nb_conda_kernels。
先查看是否安装了nb_conda_kernels,Windows用户可以使用以下两种命令:
conda list -n base | findstr nb_conda_kernels
这个命令在cmd和powershell中通用。
conda list -n base | Select-String "nb_conda_kernels"
这个命令可在powershell中使用。
为了解决这个问题,我们可以选择让jupyter只显示我们手动注册的kernel,并移除自动检测的包。
- 卸载nb_conda_kernels包,这样就不会自动显示所有符合条件的conda环境了。注意这个包是在base环境下的,要在base环境卸载。
- 为每个需要在jupyter中使用的conda环境手动注册kernel
- 清理已经存在的重复kernel(如果有的话),先别急着清理,先刷新jupyter页面或者重启jupyter服务看一看是否还有重复。下一部分具体讲删除kernel。
当然你选择只采取方法三也可以,删除手动注册的kernel就可以了,具体见后文。
另外,内核混乱的情况还可能是因为卸载的内核有残留、系统中有多个jupyter实例(比如同时存在conda安装的jupyter和pip安装的jupyter)、移动过conda的安装目录导致路径变化、自定义了不正确的kernel文件保存的位置等等。
3. 删除kernel
如果你需要删除kernel,可以用以下命令删除:
jupyter kernelspec uninstall my_env
注意,参数my_env指的是kernel名称,一般推荐和环境同名。
如果有残留,可以找到保存目录自己手动删除。保存目录可以通过jupyter kernelspec list查看。
删除kernel一般不会造成严重后果:
- 如果kernel名称不变(新kernel与原kernel名字一样):当我们注册同名kernel时,即使路径不同,notebook文件打开时会自动关联到新注册的同名kernel,通常不会出现问题。
- 如果kernel名称改变:当打开旧的notebook文件时,jupyter会尝试寻找文件中记录的kernel名称,找不到同名kernel时,jupyter会尝试使用当前默认的kernel(通常是base环境的kernel),或者提示用户选择可用的kernel(此时会显示“kernel not found”错误,需要手动从当前可用的kernel列表中选择一个)。
这是因为kernel和notebook文件保存的位置不一样,删除内核的操作仅仅删除内核定义文件,虚拟环境也不会被删除,因此不会对你的项目造成影响。不过要注意,如果你重新指定了另一个环境的kernel,需要考虑该环境和你的项目代码能否兼容的问题。
4. 关于kernel的存放位置
kernel的默认保存地址
我们手动注册的kernel默认的存放地址是系统盘,在Windows系统上,默认存放目录是C:\Users<用户名>\AppDate\Roaming\jupyter\kernels(或者C:\ProgramData\jupyter\kernels)。不过,base环境的kernel默认的存放地址是conda安装目录下的share\jupyter\kernels。kernel保存在系统盘完全没有问题,配置通常很小,并且易于备份,但是注意重装系统时可能会丢失。
如果不愿意放在系统盘,最简洁的方法是设置全局的JUPYTER_PATH环境变量。假设你希望指定D:\jupyter_kernels为存放位置,以下为操作步骤。
增加环境变量JUPYTER_PATH:
右击“此电脑”,点击“属性”,搜索“高级系统设置”,点击“环境变量”,在系统变量区域点击新建:
- 变量名:JUPYTER_DATA_DIR
- 变量值:D:\jupyter_kernels
然后点击确认保存所有对话框。最后需要重启电脑使变更生效。
此后注册的kernel都会默认保存在这里。需要注意的是,D:\jupyter_kernels只是一个前缀目录,kernel会被安装到该目录下的share\jupyter\kernels子目录中。
修改了kernel的默认存放地址之后,之前的kernel是否需要迁移?
答案是可以不迁移,jupyter在启动时会调用jupyter_core.paths模块确定搜索路径,一般来说data搜索路径大概是JUPYTER_DATA_DIR指定的路径→用户默认路径→系统全局路径→conda环境路径,具体的路径和顺序可以运行jupyter --path命令查看,因此之前保存在用户默认路径(或者系统默认路径)中的kernel依旧可以正常工作。
如果你想要迁移它们的话,直接手动把它们移动到新目录下即可。但是不推荐改变base环境的kernel的位置。因为base环境的kernel是conda安装的一部分,在conda更新时会维护这个kernel,因此如果你移动它的位置的话,将来有可能出现更新异常。如果你一定要把base环境的kernel迁移到新位置的话,不建议直接手动移动文件,正确的方式是先移除旧的kernel注册,然后重新注册,就会默认保存到新位置了。如果旧的kernel文件没有删除干净的话,此时可以手动删除。将来conda更新后,可能会在原来的默认位置再次出现一个base环境的kernel,这点需要注意。
5. 最后对比一下两种方法的优劣
手动注册kernel
优点:
- 精细控制,可以自定义kernel名称,指定存储位置等
- jupyter启动更快,内核启动更稳定
- 混合环境支持,可以注册非conda环境
缺点:
- 每个环境需要手动注册,环境删除后需要清除kernel
- 需要自己管理内核
自动检测kernel
优点:
- 零配置管理,不用手动注册kernel,环境删除后自动消失
- 节省空间,不生成kernel文件(不过需要的空间本来就没多大)
缺点:
- 启动慢,每次启动都要扫描
- 自定义受限,不能修改kernel显示的名称
- 仅支持conda环境
- 内核问题不易调试
更多推荐



所有评论(0)