如何在 JupyterLab 中把 ipykernel 切换到不同的 conda 虚拟环境?

内容简介:学习虚拟环境配置时,您可能见过在 JupyterLab (或 Jupyter Notebook) 中切换不同 kernel 的做法,看着就很酷哈哈。那么,这样做有什么作用呢?能够更加方便地使用虚拟环境吗?要怎么做才能实现这个功能呢?本文将为您详细介绍。

本文的基础是会使用 conda 配置虚拟环境,欢迎阅读我的文章: 使用 conda 配置虚拟环境与管理安装包。

学了 Anaconda 虚拟环境配置之后,我看到有运行环境配置文件 (environment.yml) 的教程,就想安装虚拟环境试试。本来觉得自己掌握了 conda 配置虚拟环境的各种操作,没想到很快就遇到了新问题。 在“Hands-On Machine Learning with Scikit-Learn, Keras & TensorFLow, 2nd Edition, by Aurelien Geron(O’Reilly)” 这本书的配套代码中 (代码的GitHub地址),作者老师写了详细的安装指南,开始的步骤和 使用 conda 配置虚拟环境与管理安装包 一文中介绍的方法没什么不同,也是用 conda env create 把 .yml 的环境配置安装上,建立一个名为 “tf2” 的虚拟环境。然而,接下来要在 tf2 环境中,输入:

(tf2)python3 -m ipykernel install --user --name=python3

据说可以设定 Jupyter Notebook 的 kernel,打开 Jupyter 就是 tf2 的环境配置。这让我十分困惑,之前我在虚拟环境(比如这里的 “tf2”)中运行 JupyterLab,import packages 的版本号都对啊。为什么还要再安装 ipykernel 呢?而且,我在使用中突然发现,import packages 引用的库及其版本号还是基于 base 环境,这是怎么回事?

stackoverflow 的这篇问答 解答了我的问题。原来,有三种方法可以使用不同虚拟环境配置的 JupyterLab (或 Jupyter Notebook) 。下面结合 tf2 这个例子来说明。

方法一

就是上文提到、我以前用的方法。有三步:1.进入虚拟环境 2.安装 jupyterlab 3.在该虚拟环境中,运行 jupyterlab。

安装:

(base)conda activate tf2
(tf2)conda install jupyterlab

使用:

(tf2)jupyter lab

这个方法简单易行,但是有两个缺点:

1.每次都要先进入这个虚拟环境,再运行代码。

2.每个虚拟环境都要安装 jupyterlab (或 jupyter notebook),其实不同虚拟环境的 jupyter 之间只是运行 python 代码的 kernel 不同(kernel 可以理解为 jupyter 中运行代码所使用的 python 解释器),编辑器等框架部分都相同。

既然这样,可不可以都用 base 环境的框架 (jupyterlab),把里面的 kernel 换一下就好了,这就是方法二的思路。

方法二

该方法需要先在虚拟环境中安装 ipykernel 及关联到 Jupyter 中,之后在 base 环境打开 Jupyter ,也可以使用虚拟环境配置了。

安装:

(base)conda activate tf2
(tf2)conda install ipykernel
(tf2)ipython kernel install --user --name=tf2

注意:kernel 命名不一定要和虚拟环境名完全相同,比如这里也可以是:--name=tf2-kernel ,但最好还是和虚拟环境名相似或相关,要不然以后可能会想不起来哪个 kernel 对应的是哪个环境了。

使用:

可以在 base 环境打开 JupyterLab ,如下所示,

(base)jupyter lab

通过切换 kernel 即可在 JupyterLab 中使用 tf2 环境配置,而不必进入 tf2 环境中。具体操作为:打开 JupyterLab ,点击 kernel 项,如下图所示,在下拉框中可以看到不同的 kernels,选择当前环境对应的 kernel,比如这里的 “tf2”,即可切换到 tf2 环境。

如何在 JupyterLab 中把 ipykernel 切换到不同的 conda 虚拟环境?_第1张图片

这其实就挺方便了,在 base 环境中打开 JupyterLab 就可以切换多个环境的 kernel。

能不能进一步简化 kernel 配置?只要虚拟环境装了 ipykernel(可以在新建虚拟环境时安装),就自动配置 kernel,都不用进入虚拟环境中写 ipython kernel install --user --name=KernelName 。这就是方法三的思路。

方法三

安装:

在 base 环境中,输入:

(base) conda install nb_conda_kernels

就安装了一个自动化的工具,实现 ipython kernel install 的功能。以后,新建的虚拟环境中只要安装了 ipykernel,该环境的 Jupyter kernel 就会自动新建。

例如,新建一个名为 “test” 的虚拟环境,新建环境时安装 ipykernel,

(base) conda create -n test ipykernel

然后就不用管了,test 环境的 kernel 会自动生成,是不是很省事呢哈哈。

使用:

和方法二相同,在 base 环境打开 JupyterLab 即可,会看到 kernel 选项新增了 “Python [conda env: test-kernel]”,选择该 kernel ,Jupyter 就使用相应的虚拟环境配置。

如果使用 JupyterLab,在初始页面还会看到新生成的不同 kernels,如下图所示。如果要新建一个 Jupyter Notebook,点击某个 kernel,即可生成一个该虚拟环境配置的空白 .ipynb 文件。

如何在 JupyterLab 中把 ipykernel 切换到不同的 conda 虚拟环境?_第2张图片

看了上面这三种方法的介绍,你可能已经知道了问题一的答案。为什么要装 ipykernel?这就是方法一和方法二的区别。装了 ipykernel,可以在 base 环境打开 JupyterLab 就使用该虚拟环境配置,而无需每次进入该虚拟环境再打开 JupyterLab。两种方法的效果是相同的。

学习了 ipykernel 之后,可能又会有新的疑问:为什么使用方法一只有默认的 Python3 kernel,没有其它 kernel 可选,那我的环境配置会不会是 base 环境?

不会,我测试了一下,因为方法一是在该虚拟环境中打开 Jupyter,就是用的这个环境配置,你可以用:

import package-name
print(package-name.__version__)

查询一下安装 package 的版本,是该虚拟环境而不是 base 环境的版本。

回到问题二,import packages 的版本号还是用的 base 环境,这是怎么回事?
我分析,问题可能出在 python3 -m ipykernel install --user --name=python3 中的命名 --name=python3。安装指南中提到,这样可以把 tf2 的 kernel 设置为默认 kernel,每次打开不用切换 kernel。但是让 tf2 的 kernel 和 base 环境的 kernel 命名相同,结果 kernel 还是 base 环境配置。在 Anaconda Prompt 输入 jupyter kernelspec list 查看 Jupyter 的 kernels,显示只有一个 kernel: python3。用不同的命名,比如 python3 -m ipykernel install --user --name=tf2,就有了 tf2 环境配置的 kernel 。为什么 tf2 的 ipykernel 用 python3 命名,不会改变默认 Python3 kernel 的环境配置,这个问题我也还没弄懂,欢迎交流和指教,谢谢!

本文对您有帮助的话,请点赞支持一下吧,谢谢!

关注我 宁萌Julie,互相学习,多多交流呀!

参考文章:

配置 kernel 的三种方法:

1.https://stackoverflow.com/questions/58068818/how-to-use-jupyter-notebooks-in-a-conda-environment/58068850

2.https://blog.csdn.net/u014264373/article/details/119390267

JupyterLab 安装 ipykernel :

3.https://zhuanlan.zhihu.com/p/478628221

你可能感兴趣的:(Python与机器学习,conda,python,jupyter)