小编典典

如何在conda环境中使用Jupyter笔记本?

python

典型地,一个运行jupyter notebookjupyter-notebookipython notebook在终端局部地启动一个Jupyter笔记本网络服务器(和打开的浏览器中的URL)。使用conda
conda环境时

最常见的错误消息似乎是:在conda环境中安装XYZ软件包后, my-env可以import XYZ在其中启动的python控制台中my- env运行,但是在 Jupyter笔记本中 运行相同的代码 将导致ImportError

这个问题已经被问过很多次了,但是没有一个很好的答案,大多数Q&A和Github的门票都很混乱,所以让我们在这里开始新的Q&A


阅读 151

收藏
2020-12-20

共1个答案

小编典典

*免责声明:仅在Ubuntu和Windows上进行了测试(请参见此答案的注释),如果使用其他操作系统时发生了变化,请发表评论。


Jupyter在称为 kernel
的单独进程中运行用户的代码。内核可以是不同的Python安装(在不同的conda环境或virtualenv或Python 2而不是Python
3中),甚至可以是不同语言的解释器(例如Julia或R)。通过指定解释器和名称以及一些其他参数(请参阅Jupyter文档)来配置内核,并且可以在系统范围内针对活动环境(或virtualenv)或每个用户存储配置。如果nb_conda_kernels使用了静态配置的内核,那么ipykernel在Jupyter笔记本中将为已安装的每个conda环境提供一个单独的内核。

简而言之,如何使用conda环境和Jupyter有三种选择:

选项1:在conda环境中运行Jupyter服务器和内核

做类似的事情:

conda create -n my-conda-env         # creates new virtual env
conda activate my-conda-env          # activate environment in terminal
conda install jupyter                # install jupyter + notebook
jupyter notebook                     # start server + kernel

Jupyter将完全安装在conda环境中。不同版本的Jupyter可以用于不同的conda环境,但是此选项可能有点过大。将内核包含在环境中就足够了,该环境是包装运行代码的Python的组件。Jupyter笔记本电脑的其余部分可以视为编辑器或查看器,无需针对每种环境单独安装它并将其包含在每个env.yml文件中。因此,以下两个选项之一可能是更可取的,但此选项是最简单的一个,绝对可以。

选项2:为conda环境创建特殊的内核

做类似的事情:

conda create -n my-conda-env                               # creates new virtual env
conda activate my-conda-env                                # activate environment in terminal
conda install ipykernel                                    # install Python kernel in new conda env
ipython kernel install --user --name=my-conda-env-kernel   # configure Jupyter to use Python kernel
jupyter notebook                                           # run jupyter from system

内核的名称和conda环境彼此独立,但是使用类似的名称可能有意义。

仅Python内核将在conda环境中运行,将使用系统中的Jupyter或其他conda环境-未将其安装在conda环境中。通过调用ipython kernel installjupyter配置为将conda环境用作内核,请参阅 Jupyter文档IPython文档以获取更多信息。在大多数Linux安装中,此配置是位于的*.json文件
~/.local/share/jupyter/kernels/my-conda-env-kernel/kernel.json

{
 "argv": [
  "/opt/miniconda3/envs/my-conda-env/bin/python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "my-conda-env-kernel",
 "language": "python"
}

选项3:使用nb_conda_kernels在conda环境中使用内核

nb_conda_kernels被安装,一个单独的内核可自动为包含康达包的每个康达环境ipykernel或不同的内核(R,朱,…)。

conda activate my-conda-env    # this is the environment for your project and code
conda install ipykernel
conda deactivate

conda activate base            # could be also some other environment
conda install nb_conda_kernels
jupyter notebook

您应该可以选择Kernel Python [conda env:my-conda-env]。注意,nb_conda_kernels
似乎只能通过conda来使用,而不能通过pip或apt等其他包管理器来使用。

故障排除

使用Linux /
Macwhich时,命令行上的命令将告诉您使用哪个jupyter,如果您使用选项1(在conda环境中运行Jupyter),则它应该是您的conda环境中的可执行文件:

$ which jupyter
/opt/miniconda3/envs/my-conda-env/bin/jupyter
$ which jupyter-notebook   # this might be different than 'which jupyter'! (see below)
/opt/miniconda3/envs/my-conda-env/bin/jupyter-notebook

在笔记本中,您应该看到Python使用了来自conda环境的Python路径:

[1] !which python
/opt/miniconda3/envs/my-conda-env/bin/python
[2] import sys; sys.executable
'/opt/miniconda3/envs/my-conda-env/bin/python'
['/home/my_user',
 '/opt/miniconda3/envs/my-conda-env/lib/python37.zip',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/lib-dynload',
 '',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/site-packages',
 '/opt/miniconda3/envs/my-conda-env/lib/python3.7/site-packages/IPython/extensions',
 '/home/my_user/.ipython']

Jupyter提供命令jupyter-troubleshoot或在Jupyter笔记本中:

!jupyter-troubleshoot

这将打印出许多有用的信息,包括上述输出以及已安装的库和其他资源。当寻求有关Jupyter安装问题的帮助时,最好在错误报告或问题中提供此信息。

要列出所有已配置的Jupyter内核,请运行:

jupyter kernelspec list

常见错误和陷阱

未在conda环境中安装Jupyter笔记本

注意:症状并非此处描述的问题所独有。

症状:
在Jupyter笔记本中,对于在conda环境中安装(但未在系统范围内安装)的模块的ImportError,但在Python终端中导入时没有错误

说明: 您尝试从conda环境中运行jupyter
notebook(选项1,请参见上文),没有为此conda环境配置内核(这将是选项2),并且未安装nb_conda_kernels(选项3),但是jupyter笔记本电脑没有(完全)安装在conda环境中,即使which jupyter可能使您相信它也是如此。

在GNU / Linux中,您可以键入which jupyter以检查哪个Jupyter可执行文件正在运行。

这意味着使用系统的Jupyter,可能是因为未安装Jupyter:

(my-conda-env) $ which jupyter-notebook
/usr/bin/jupyter

如果路径指向您的conda环境中的文件,则从Jupyter内部运行Jupyter:

(my-conda-env) $ which jupyter-notebook
/opt/miniconda3/envs/my-conda-env/bin/jupyter-notebook

请注意,在ipykernel安装conda软件包时,jupyter会附带一个可执行文件,但没有可执行文件jupyter- notebook。这意味着which jupyter将返回路径到conda环境,但jupyter notebook将启动系统的路径jupyter- nootebook(另请参见此处):

 $ conda create -n my-conda-env
 $ conda activate my-conda-env
 $ conda install ipykernel
 $ which jupyter            # this looks good, but is misleading!
 /opt/miniconda3/envs/my-conda-env/bin/jupyter
 $ which jupyter-notebook   # jupyter simply runs jupyter-notebook from system...
 /usr/bin/jupyter-notebook

发生这种情况是因为jupyter notebook搜索jupyter-notebook,查找 /usr/bin/jupyter- notebook
调用它
开始了一个新的Python进程。在家当/usr/bin/jupyter-notebook就是#!/usr/bin/python3
和不是动态)
#!/usr/bin/env python。因此,Python设法突破了conda环境。我猜想jupyter可以调用 python /usr/bin/jupyter-notebook来代替shebang,但是混合系统的bin文件和环境的python路径无论如何都无法正常工作。

解决方案:在 conda环境中安装jupyter笔记本:

 conda activate my-conda-env
 conda install jupyter
 jupyter notebook

错误的内核配置:内核配置为使用系统Python

注意:症状并非此处描述的问题所独有。

症状:
在Jupyter笔记本中,对于在conda环境中安装(但未在系统范围内安装)的模块的ImportError,但在Python终端中导入时没有错误

说明: 通常,系统提供一个名为python3的内核(显示名称为“ Python
3”),该内核配置为使用/usr/bin/python3,请参见例如/usr/share/jupyter/kernels/python3/kernel.json。这通常在conda环境中被内核覆盖,该内核指向python
binary环境/opt/miniconda3/envs/my-conda-env/bin/python。两者都是由包生成的
ipykernel(请参见此处
此处)。

中的用户内核规范~/.local/share/jupyter/kernels/python3/kernel.json可能会覆盖系统范围和环境内核。如果缺少环境内核或用户内核指向环境选项1之外的python安装(在环境中安装jupyter)将失败。

有关此问题和变体的发生和讨论,请参见此处
此处
此处
此处
此处
此处

解决方法: 使用jupyter kernelspec list列出的位置活动的内核位置。

$ conda activate my-conda-env
$ jupyter kernelspec list
Available kernels:
  python3 /opt/miniconda3/envs/my-conda-env/share/jupyter/kernels/python3

如果缺少环境中的内核,则可以尝试ipython kernel install --sys-prefix在激活的环境中使用手动创建它
,但是最好检查一下安装,因为conda install ipykernel应该已经创建了环境(也许尝试重新创建环境并重新安装所有环境)。包?)。

如果用户内核规范阻止了环境内核规范,则可以将其删除,也可以使用相对的python路径$PATH来确定python使用哪个。所以这样的事情应该是完全可以的:

$ cat ~/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}

正确的conda环境未激活

症状: Jupyter笔记本和Python终端中安装在conda环境中(但未在系统范围内安装)的模块的ImportError

说明: 每个终端都有一组环境变量,这些变量在终端关闭时会丢失。为了使用conda环境,需要设置某些环境变量,方法是使用激活它conda activate my-conda- env。如果您尝试从conda环境(选项1)内部运行Jupyter笔记本,但是在运行conda环境之前未激活它,则可能会运行系统的jupyter。

解决方案: 在运行Jupyter之前激活conda环境。

 conda activate my-conda-env
 jupyter notebook

内核配置损坏

症状: 发生奇怪的事情。可能与上面类似的症状,例如ImportError

说明:
如果您尝试使用选项2,即通过使用内核的显式配置在conda环境中从系统和Jupyter内核运行Jupyter,但它的行为不符合您的预期,则该配置可能会以某种方式被破坏。

解决方案: 检入配置~/.local/share/jupyter/kernels/my-kernel-name/kernel.json
并手动纠正错误,或者使用上面提供的选项2的命令删除整个目录并重新创建它。如果找不到内核配置,请运行 jupyter kernelspec list

Python 2与3

症状:
由于错误的Jupyter内核的Python版本或Python2/3的其他问题,导致ImportErro

说明: 内核配置可能具有各种令人困惑和误导的效果。例如,默认的Python 3内核配置将允许我启动在Python 2上运行的Jupyter笔记本:

conda create -n my-conda-env
conda activate my-conda-env
conda install python=2
conda install jupyter
jupyter notebook

默认的Python 3内核:

$ cat ~/.local/share/jupyter/kernels/python3/kernel.json
{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}

使用Python 3内核创建新的Jupyter Notebook后,即使Jupyter显示“ Python 3”,也将使用conda环境中的Python
2。

解决方案: 不要使用Python 2 ;-)

2020-12-20